一尘不染

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

django

我已经做了一个不错的表格,并使用了一个复杂的“添加”函数来处理它。像这样开始

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在哪里放置add功能?之所以必须在此之后,是form.save因为这是创建文章的地方,但它甚至永远都不会达到那个目的,因为由于唯一的约束,表单是无效的(除非用户编辑了所有内容)。我可以删除is_valid支票,但随后form.save失败。
  2. 如果表单实际上是无效的,则不会保留我在edit函数中动态添加的字段。
    那么我该如何处理呢?

阅读 316

收藏
2020-03-27

共1个答案

一尘不染

如果要从ModelForm扩展表单,请使用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\d+)/$’, views.edit, {}, ‘article_edit’),
edit添加和编辑使用相同的视图,但是只有编辑URL模式将ID传递给视图。为了使它与您的表单一起使用,您需要author从表单中省略该字段:

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

2020-03-27