以django形式添加经理
Adding manager in django form
我想从扩展配置文件模型创建用户,它是使用 api 请求完成的,但是从表单中它不起作用。在 api 请求正文中,我仅传递名称、电子邮件和 phone_number 三个字段,以便密码自动随机生成。
class ProfileManager(model.Manager):
def create(self, email,phone_number, **kwargs):
password=str(random.random())[2:8]
user = User(username=phone_number)
user.set_password(password)
user.save()
profile = Profile(
user=user,
email=email,
**kwargs
)
profile.save()
如果我使用的形式类似于
class CustomerCreateForm(forms.ModelForm):
name =forms.CharField(label='Name', max_length=32)
phone_number = forms.CharField(label='Name', max_length=32)
class Meta:
model=Profile
fields=['email','name','phone_number']
这,它像用户一样出错(1048,“列 'user_id' 不能为空”)
因为我的个人资料模型看起来像
class Profile(models.model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
email = models.CharField(max_length=50,null=True, blank=True)
phone_number = models.CharField(max_length= 15, null=True, blank=True)
所以从这里我了解到 ProfileManager 不依赖于表单,所以我需要使 def validate(self,attrs) like function 和 differet manger for form ,但我不知道该怎么做,因为新手。
感谢任何帮助
您在 CustomerCreateForm
字段属性中遗漏了 user
字段。而且您设置的是 auth_user
而不是 user
?所以将它添加到 fields 属性上,并将用户字段设置为空白,如下所示:
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
由于用户是在提交表单后手动创建的。
解决方案取决于您如何使用表单...我看到两个解决方案:
保存表单时不提交
如果将 commit 形式的 save 方法的参数设置为 False,模型对象的属性将根据但不会更新保存在数据库中。
这允许您在保留更改之前进一步处理它。
例如,在 CreateView 中,如果您使用 Class Based View,您将重写 form_valid 方法]:
def form_valid(self, form):
obj = form.save(commit=False) # obj.save() not called by the form
obj.user = self.request.user # or other user source
obj.save() # model instance saved in db with validated constraints
return HttpResponseRedirect(self.get_success_url())
如果使用函数视图,思路是一样的:
def my_view(request):
# Omitting HTTP method check for simplicity
my_form = Form(data=request.Post)
if my_form.is_valid():
obj = form.save(commit=False)
obj.user = self.request.user
obj.save()
return HttpResponseRedirect(self.get_success_url())
# template stuff goes here
传递表单中的缺失值
这个不如第一个干净...
您覆盖表单的 constructor 和 save 方法以添加缺少的字段值:
class 我的表格(forms.ModelForm):
# 这里是元数据
def __init__(self, user, **kwargs):
self.user = user
super().__init__(**kwargs)
def save(self, commit=True):
# add missing fields
self.instance.user = self.user
# and proceed with normal form flow
return super().save(commit)
我想从扩展配置文件模型创建用户,它是使用 api 请求完成的,但是从表单中它不起作用。在 api 请求正文中,我仅传递名称、电子邮件和 phone_number 三个字段,以便密码自动随机生成。
class ProfileManager(model.Manager):
def create(self, email,phone_number, **kwargs):
password=str(random.random())[2:8]
user = User(username=phone_number)
user.set_password(password)
user.save()
profile = Profile(
user=user,
email=email,
**kwargs
)
profile.save()
如果我使用的形式类似于
class CustomerCreateForm(forms.ModelForm):
name =forms.CharField(label='Name', max_length=32)
phone_number = forms.CharField(label='Name', max_length=32)
class Meta:
model=Profile
fields=['email','name','phone_number']
这,它像用户一样出错(1048,“列 'user_id' 不能为空”) 因为我的个人资料模型看起来像
class Profile(models.model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
email = models.CharField(max_length=50,null=True, blank=True)
phone_number = models.CharField(max_length= 15, null=True, blank=True)
所以从这里我了解到 ProfileManager 不依赖于表单,所以我需要使 def validate(self,attrs) like function 和 differet manger for form ,但我不知道该怎么做,因为新手。 感谢任何帮助
您在 CustomerCreateForm
字段属性中遗漏了 user
字段。而且您设置的是 auth_user
而不是 user
?所以将它添加到 fields 属性上,并将用户字段设置为空白,如下所示:
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
由于用户是在提交表单后手动创建的。
解决方案取决于您如何使用表单...我看到两个解决方案:
保存表单时不提交
如果将 commit 形式的 save 方法的参数设置为 False,模型对象的属性将根据但不会更新保存在数据库中。 这允许您在保留更改之前进一步处理它。
例如,在 CreateView 中,如果您使用 Class Based View,您将重写 form_valid 方法]:
def form_valid(self, form):
obj = form.save(commit=False) # obj.save() not called by the form
obj.user = self.request.user # or other user source
obj.save() # model instance saved in db with validated constraints
return HttpResponseRedirect(self.get_success_url())
如果使用函数视图,思路是一样的:
def my_view(request):
# Omitting HTTP method check for simplicity
my_form = Form(data=request.Post)
if my_form.is_valid():
obj = form.save(commit=False)
obj.user = self.request.user
obj.save()
return HttpResponseRedirect(self.get_success_url())
# template stuff goes here
传递表单中的缺失值
这个不如第一个干净... 您覆盖表单的 constructor 和 save 方法以添加缺少的字段值:
class 我的表格(forms.ModelForm): # 这里是元数据
def __init__(self, user, **kwargs):
self.user = user
super().__init__(**kwargs)
def save(self, commit=True):
# add missing fields
self.instance.user = self.user
# and proceed with normal form flow
return super().save(commit)