在CreateView中设置Django ModelForm字段值

1 投票
2 回答
2655 浏览
提问于 2025-04-18 11:23

我需要通过我的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

撰写回答