Django Form排除form.as_div()中的字段

时间:2015-11-13 12:35:37

标签: django forms

您好我正在尝试注册一个有地址的用户。我正在尝试使用http://django-angular.readthedocs.org/

生成表单
# models.py
class Address(models.Model):
    user        = models.ForeignKey(User)
    line_1      = models.CharField(max_length=256, null=True, blank=True)
    ...
# forms.py
class AddressForm(NgFormValidationMixin, Bootstrap3FormMixin, NgModelForm):
    class Meta:
        model = Address
        fields = ('line_1','city', 'state', 'user')
        # exclude = ('user',)  #this line
# views.py
class Register(APIView):
    def post(self, request):
        ...
        if userform.is_valid():
            user = userform.save()
            address = request.data['address']
            address['user'] = user.id
            addressform = AddressForm(address)
            if addressform.is_valid():
                addressform.save()  # gives error here if I add exclude('user', ) in form
            # else
                # revert the changes
        # else
            # revert the changes

如果我生成表格为 AddressForm().as_div()它获取所有用户详细信息,并且可以作为注册用户的下拉列表使用。 (大不)

所以我将exclude = ('user',)添加到表单中。然后,AddressForm在我的视图中提出错误,IntegrityError: accounts_address.user_id may not be NULL

如何在模板和模板中使用相同的表单查看?

1 个答案:

答案 0 :(得分:2)

这与form.as_div()无关,或与“在模板和视图中使用相同的表单”无关。

如果排除字段,将其添加到表单数据将无效,正是因为您已明确排除它。您应该只从POST数据中实例化它们,而不是保存一个表单并将结果放入数据中以实例化第二个表单,但是在地址表单上使用commit=False保存以获取可以在保存之前操作的对象db。

def post(self, request):
    ...
    if userform.is_valid() and addressform.is_valid():
        user = userform.save()
        address = addressform.save(commit=False)
        address.user = user
        address.save()
        ...

这样您也无需担心回滚更改。