从django中的formview保存modelform数据

时间:2012-06-01 21:10:14

标签: django django-forms django-class-based-views

所以我是django的新手,我正在努力使用基于类的视图的文档。不确定我在这里做错了什么,但这就是问题所在:

我在表单上填写适当的数据,点击提交,然后我被重定向到相同的网址以及与我在表单中提交的内容相对应的一些get参数。数据库中没有添加任何新内容。我想点击提交时在数据库中创建一个新的Advertisement行。

我有一个ModelForm如下:

class NewAdForm(ModelForm):
    class Meta:
            model = Advertisement
            exclude = ('campaign',)

    def __init__(self, campaign, *args, **kwargs):
            super(NewAdForm, self).__init__(*args, **kwargs)
            self.campaign = campaign

我还有一个FormView:

class AddAdvertView(FormView):
    form_class = NewAdForm
    template_name = 'advertisers/newad.html'

    def get_form_kwargs(self):this
            kwargs = super(AddAdvertView, self).get_form_kwargs()
            kwargs['campaign'] = get_object_or_404(Campaign, id__exact = self.kwargs['campaign_id'])
            return kwargs

    def form_valid(self, form):
            form.save(commit = True)
            return super(AddAdvertView, self).form_valid(form)

这是模板:

<form action="" method="get">
{{ form.as_p }}
<input type="submit" value="Submit"/>
</form>

2 个答案:

答案 0 :(得分:3)

您使用method="get"的原因是什么? FormView类可能需要POST才能触发验证和保存。 GET通常只用于渲染初始形式。

答案 1 :(得分:0)

这可能是因为你错过了CSRF令牌,但它真的应该给你一个错误。不过,试试:

<form action="" method="get">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit"/>
</form>

此外,虽然它没有解释为什么表单未保存,但您需要在success_url上指定FormView,用户在成功提交表单后应重定向到的网址。我实际上从来没有尝试过它,但是视图可能会让你回到表单只是因为它不知道还能去哪里。