我的 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 CheckboxSelectMultiple 覆盖 ModelForm 中的“选择”
Django - 来自数据库的 ModelForm 初始数据