在CreateView中设置Django ModelForm字段值
我需要通过我的Django模型的CreateView来设置一个布尔字段的值。可是,在form_valid()里设置这个值似乎没有效果。
这是我的模型:
class Feedback(models.Model):
was_satisifed = models.BooleanField(
help_text='Returns true if the user exits the process early.',
default=False)
这是我的视图:
class FeedbackActionMixin(object):
model = Feedback
form_class = FeedbackForm
def form_valid(self, form):
instance = form.save(commit=False)
instance.was_satisfied = True
return super(FeedbackActionMixin, self).form_valid(form)
表单提交了,但是“was_satisfied”的值还是保持在默认的False。我漏掉了什么呢?
2 个回答
0
如果我没记错的话,form_valid
是在数据已经提交之后被调用的。你可以试着在你的混合类中重写 post
方法:
class FeedbackActionMixin(object):
model = Feedback
form_class = FeedbackForm
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
form.was_satisfied = True
return self.form_valid(form)
else:
return self.form_invalid(form)
0
我最后做的事情是,在 forms.py
文件里,而不是在 views.py
文件里:
class SuccessfulFeedbackForm(FeedbackFormMixin, forms.ModelForm):
def __init__(self, *args, **kwargs):
super(SuccessfulFeedbackForm, self).__init__(*args, **kwargs)
self.fields['was_satisifed'].initial = True
class UnsuccessfulFeedbackForm(FeedbackFormMixin, forms.ModelForm):
def __init__(self, *args, **kwargs):
super(UnsuccessfulFeedbackForm, self).__init__(*args, **kwargs)
self.fields['was_satisifed'].initial = False