【问题标题】:Django gives IntergrityError, user.id NOT null, don't know whyDjango给出IntergrityError,user.id NOT null,不知道为什么
【发布时间】:2013-08-14 00:50:20
【问题描述】:

我正在尝试制作一个模型表单,用于发送电子邮件以更改用户条目上的电子邮件,由于某种原因,当我单击表单上的提交时,它给了我access_emailchangeauth.user_id may not be NULL。我不知道为什么。

代码如下

def changeEmail(request):
    data = request.POST if request.method == 'POST' else None
    if data:
        form = ChangeEmailForm(data)
        if form.is_valid():
            form.save(user=request.user)
        else:
            a = request.user
            a = u.objects.get(username__iexact=a)
            form = UserModificationForm(instance=a)
            form2 = ChangeEmailForm()
            return render('accounts/modify.html',{'form': form, 'form2': form2, 'usr': a})

#forms.py
class ChangeEmailForm(ModelForm):
    class Meta:
        model = EmailChangeAuth
        fields = ['new_email']

    def save(self, *args, **kwargs):
        user = kwargs.pop('user')
        self.user = user
        print user
        super(ChangeEmailForm, self).save(*args, **kwargs)
#models.py

class EmailChangeAuth(models.Model):
    auth_code = UUIDField(auto=True, unique=True)
    user = models.ForeignKey(u)
    new_email = models.EmailField(max_length=256)

    def __unicode__(self):
        return unicode(self.auth_code)

【问题讨论】:

    标签: python django forms models modelform


    【解决方案1】:

    由于您没有将用户包含在字段列表中,因此不会将其传递给 ModelForm 的实例构造函数。

    因此,您在这里想要更改表单实例的用户属性,而不是表单对象本身的属性。在 .save() 中,将 self.user 更改为 self.instance.user。这应该会让你继续前进。

    但是,我还想建议这种机制通常是一种反模式:如果它是您填充的必填字段,为什么您不允许用户成为 ModelForm 上的字段?

    【讨论】:

    • 我希望用户自动填写,但没有字段。用户应该是登录的人,如果他们想更改他们的电子邮件,就是这样。
    • 另外,是的,有效!如果您知道解决反模式问题的方法,请尽可能告诉我?
    • 明白了。在这种情况下,您可能不希望 user 在您的保存方法中,而是在您在视图逻辑中验证模型表单后设置它。 (换句话说,将 form.instance.user = request.user 放在您的视图中 form.save() 之前)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多