我的 Django ModelForm 是未绑定的吗?

Posted

技术标签:

【中文标题】我的 Django ModelForm 是未绑定的吗?【英文标题】:Is my Django ModelForm unbound? 【发布时间】:2018-09-15 02:17:33 【问题描述】:

在过去的几天里,我一直在与CreateView 和相应的ModelForm 作斗争:我无法获取表单来处理发布的数据并保存对象。提交数据时,我会被发送回与表单相同的页面。

form.errors form.non_field_errors 在我的模板中没有输出任何内容,因此似乎没有任何错误。

我做错了什么?我必须手动将数据绑定到表单吗?

views.py

class CreateFlyerView(CreateView, CookLoginRequired):
    template_name = 'flyer/create.html'
    model = Flyer
    form_class = CreateFlyerForm
    success_url = reverse_lazy('flyer_start')

    def get_form_kwargs(self):
        kwargs = super(CreateFlyerView, self).get_form_kwargs()
        kwargs.update('user': self.request.user)
        return kwargs

    def get_context_data(self, **kwargs):
         context = super(CreateFlyerView, self).get_context_data(**kwargs)
         now = datetime.datetime.now()
         meals_as_host = MenuOffer.objects.filter(deleted=False, host=self.request.user).order_by('cdate')
         upcoming_meals_as_host = meals_as_host.filter(eating_time__gte=now).order_by('cdate')[:4]
         past_flyers = Flyer.objects.filter(host=self.request.user, cdate__lt=now)

         context.update(
             'upcoming_meals_as_host': upcoming_meals_as_host,
             'past_flyers': past_flyers,
             'user_images': Image.objects.filter(account=self.request.user),
                 )
         return context

forms.py

class CreateFlyerForm(forms.ModelForm):
    picture = forms.ModelChoiceField(widget=forms.Radioselect, queryset=Image.objects.all())
    meals = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=MenuOffer.objects.all())
    headline = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = Flyer
        fields = ['headline', 'copy', 'avatar', 'style', 'greeting', 'picture', 'meals']

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(CreateFlyerForm, self).__init__()
        self.fields['headline'].initial = _(u'Some headline with ').format(user.neighborhood if user.neighborhood else user.place)
        self.fields['copy'].initial = _(u'Some copy.')
        self.fields['avatar'].initial = user.image
        self.fields['style'].initial = 'MODERN'
        self.fields['greeting'].initial = user.first_name
        self.fields['picture'].queryset = Image.objects.filter(account=user)
        self.fields['meals'].queryset = MenuOffer.objects.filter(deleted=False, host=user, eating_time__gte=datetime.datetime.now()).order_by('cdate')[:4]

【问题讨论】:

您确定不是因为会话已过期而将您踢出吗? CookLoginRequired 是做什么的?如果是为了限制对特定用户的访问,请确保您继承自 UserPassesTestMixin @BurhanKhalid:确保我继承自 UserPassesTestMixin 是一个很好的建议。虽然那不是问题。 Alasdair 的回答成功了。 【参考方案1】:

您忘记将*args**kwargs 传递给__init__ 方法中的super() 调用。因此该表单始终使用data=None 进行初始化,因此它是一个未绑定的表单。

应该是:

class CreateFlyerForm(forms.ModelForm):
    ...

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(CreateFlyerForm, self).__init__(*args, **kwargs)
        ...

【讨论】:

以上是关于我的 Django ModelForm 是未绑定的吗?的主要内容,如果未能解决你的问题,请参考以下文章

Django(Form,ModelForm)

Form和ModelForm

Django CheckboxSelectMultiple 覆盖 ModelForm 中的“选择”

Django - 来自数据库的 ModelForm 初始数据

从 Django 中基于类的通用视图将 request.user 对象发送到 ModelForm

为啥我的 Django ModelForm 不会引发 unique_together 约束的验证错误?