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

我做了一个很好的表单,还有一个非常复杂的“添加”function来处理它。 像这样开始…

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()方法中复制所有的function,所以我想edit可以使用完全相同的模板,也许只是添加一个id字段到表单,所以add函数知道它正在编辑。 但是这有几个问题

  1. 我将在哪里add func的article.id ? 它必须在form.save之后,因为这是创build文章的地方,但它永远不会达到这个目的,因为由于唯一约束(除非用户编辑所有内容),表单是无效的。 我可以删除is_valid检查,但是然后form.save失败。
  2. 如果表单实际上无效的,我不会保留在编辑function中dynamic添加的字段。

那我该如何处理呢?

如果要从ModelForm扩展表单,请使用instance关键字参数。 在这里,我们传递一个现有的instance或一个新的instance ,这取决于我们是编辑还是添加现有的文章。 在这两种情况下, author字段都设置在实例上,所以commit=False不是必需的。 还要注意,我假设只有作者可以编辑自己的文章,因此HttpResponseForbidden响应。

 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 }) 

在你的urls.py

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

同样的edit视图用于添加和编辑,但是只有编辑url模式才能将id传递给视图。 为了使你的表单很好地工作,你需要从表单中省略author字段:

 class ArticleForm(forms.ModelForm): class Meta: model = Article exclude = ('author',) 

你可以在窗体中隐藏ID字段,编辑窗体将通过表单添加窗体,你可以在req.POST例如

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

并通过formDataforms