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
函数知道它正在编辑。 但是这有几个问题
- 我将在哪里
add
func的article.id
? 它必须在form.save
之后,因为这是创build文章的地方,但它永远不会达到这个目的,因为由于唯一约束(除非用户编辑所有内容),表单是无效的。 我可以删除is_valid
检查,但是然后form.save
失败。 - 如果表单实际上是无效的,我不会保留在编辑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