Django基于添加表单编辑表单?

时间:2009-12-06 03:18:48

标签: python django forms logic

我做了一个很好的表格,还有一个很复杂的“添加”功能来处理它。它就像这样......

def add(req):
    if req.method == 'POST':
        form = ArticleForm(req.POST)
        if form.is_valid():
            article = form.save(commit=False)
            article.author = req.user
            # more processing ...

现在我真的不想复制edit()方法中的所有功能,所以我认为edit可以使用完全相同的模板,也许只需添加id字段到表单,以便add函数知道它正在编辑什么。但是这个有几个问题

  1. 我会在article.id func中设置add的位置?它必须在form.save之后,因为这是文章创建的地方,但它甚至永远不会达到,因为由于唯一约束,表单无效(除非用户编辑了所有内容)。我可以删除is_valid支票,但后来form.save失败了。
  2. 如果实际的格式无效,则不会保留在编辑功能中动态添加的字段。
  3. 那我该怎么处理呢?

2 个答案:

答案 0 :(得分:98)

如果要从ModelForm扩展表单,请使用instance关键字参数。在这里,我们传递现有的instance或新的author,具体取决于我们是在编辑还是添加现有文章。在这两种情况下,commit=False字段都在实例上设置,因此不需要from django.http import HttpResponseForbidden from django.shortcuts import get_object_or_404, redirect, render, reverse @login_required def edit(request, id=None, template_name='article_edit_template.html'): if id: article = get_object_or_404(Article, pk=id) if article.author != request.user: return HttpResponseForbidden() else: article = Article(author=request.user) form = ArticleForm(request.POST or None, instance=article) if request.POST and form.is_valid(): form.save() # Save was successful, so redirect to another page redirect_url = reverse(article_save_success) return redirect(redirect_url) return render(request, template_name, { 'form': form }) 。另请注意,我假设只有作者可以编辑他们自己的文章,因此HttpResponseForbidden响应。

urls.py

在您的(r'^article/new/$', views.edit, {}, 'article_new'), (r'^article/edit/(?P<id>\d+)/$', views.edit, {}, 'article_edit'),

edit

相同的author视图用于添加和编辑,但只有编辑网址模式将id传递给视图。为了使您的表单更好地工作,您需要省略表单中的class ArticleForm(forms.ModelForm): class Meta: model = Article exclude = ('author',) 字段:

{{1}}

答案 1 :(得分:2)

您可以在表单中使用隐藏的ID字段,对于编辑表单,它将与添加表单一起传递,您可以在req.POST中设置它,例如

formData =  req.POST.copy()
formData['id'] = getNewID()

并将formData传递给表单