2015-10-16 95 views
0

我目前正在处理我们的用户配置文件。用户可以将多个电子邮件地址添加到他/她的帐户。Django ModelForm在提交提交后添加外键忽略

views.py

@login_required(login_url='/login') 
def profile_update_emails(request): 
    context = {} 
    ... 
    try: 
     email = CustomerEmails.objects.get(customer=request.user) 
     update_emails_form = UpdateEmailsForm(request.POST or None, instance=email) 
    except CustomerEmails.DoesNotExist: 
     update_emails_form = UpdateEmailsForm(request.POST or None) 
    context.update({'update_emails_form': update_emails_form}) 

    if request.POST: 
     if update_emails_form.is_valid(): 
      update_emails_form.save(commit=False) 
      update_emails_form.customer = request.user 
      update_emails_form.save() 
      messages.success(request, "All good") 

return render(request, 'usercp/profile.html', context) 

forms.py

class UpdateEmailsForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(forms.ModelForm, self).__init__(*args, **kwargs) 
     for f in self.fields: 
      self.fields[f].widget.attrs['class'] = 'form-control' 

    class Meta: 
     model = CustomerEmails 
     fields = ('email',) 

models.py

class CustomerEmails(models.Model): 
    customer = models.ForeignKey(Customer) 
    email = models.CharField(max_length=255, unique=True) 

错误/迹:

IntegrityError at /usercp/profile/profile_update_emails 
(1048, "Column 'customer_id' cannot be null") 

请注意我有一个自定义用户模型。这不是问题。

我不太确定,为什么在第二次save()之前客户字段没有被填充。 CustomerEmails模型的表中目前没有行。 (我知道这将在未来与.get()发生冲突,因为用户可以有多个电子邮件,但首先要做的事情)

回答

0

您需要设置模型实例的关系,从形式保存,而不是形式本身。

obj = update_emails_form.save(commit=False) 
    obj.customer = request.user 
    obj.save() 
+0

噢男孩。星期五..非常感谢。我在这里疯了,为什么这不起作用....所有的好感谢丹尼尔 – Richard