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

2023-12-01

我制作了一个漂亮的表单,以及一个用于处理它的大而复杂的“添加”函数。事情是这样开始的……

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 in the add功能?必须是在之后form.save因为那是创建文章的地方,但它甚至永远不会到达那里,因为由于独特的约束,表单无效(除非用户编辑了所有内容)。我可以删除is_valid检查一下,但是然后form.save相反失败了。
  2. 如果表格实际上is无效,我在编辑功能中动态添加的字段不会保留。

那么我该如何处理这个问题呢?


如果您要从 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<id>\d+)/$', views.edit, {}, 'article_edit'),

相同editview 可用于添加和编辑,但只有编辑 url 模式才会将 id 传递给视图。为了使其与您的表单配合良好,您需要省略author表单中的字段:

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        exclude = ('author',)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django基于添加表单编辑表单? 的相关文章

随机推荐