from - python製作表單




Django基於添加表單編輯表單? (2)

我做了一個很好的表單,還有一個很複雜的“添加”功能來處理它。 它像這樣開始......

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. 我在哪裡可以在add func中設置article.id ? 它必須在form.save之後,因為那是文章創建的地方,但它甚至永遠不會達到,因為表單因唯一約束而無效(除非用戶編輯了所有內容)。 我可以刪除is_valid檢查,但然後form.save失敗了。
  2. 如果表單實際上無效,則不會保留在編輯功能中動態添加的字段。

那麼我該如何處理呢?


如果要從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()

並將formData傳遞給表單







logic