以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

传递表单中的缺失值

这个不如第一个干净... 您覆盖表单的 constructorsave 方法以添加缺少的字段值:

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)