Ответ 1
Если вы расширяете форму из ModelForm, используйте аргумент ключевого слова instance
. Здесь мы передаем либо существующий instance
, либо новый, в зависимости от того, редактируем ли мы или добавляем существующую статью. В обоих случаях в экземпляре задается поле author
, поэтому commit=False
не требуется. Также обратите внимание, что я предполагаю, что автор может редактировать свои собственные статьи, следовательно, HttpResponseForbidden response.
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-адреса редактирования передает идентификатор в представление. Чтобы сделать эту работу хорошо с вашей формой, вам нужно опустить поле author
из формы:
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
exclude = ('author',)