汎用ビューを使用すると、はるかに短いコードを記述できます。
比較:
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render_to_response, get_object_or_404, redirect
from myapp.models import Context
def edit(request, item_id):
object = get_object_or_404(Context, pk=item_id)
if request.method == 'POST':
form = ContextForm(request.POST, instance=object)
if form.is_valid():
form.save()
return redirect('myapp-context-index')
else:
form = ContextForm(instance=object)
return render_to_response("myapp/context/edit.html", {'object': object, 'form': form})
と:
from django.core import urlresolvers
from django.views.generic.create_update import update_object
from myapp.models import Context
def edit(request, item_id):
return update_object(request,
object_id=item_id,
form_class=ContextForm,
template_name="myapp/context/edit.html",
post_save_redirect=urlresolvers.reverse("myapp-context-index")
)
通常のビューと同様に、それらは単なる通常の機能です。必要に応じて、URLconf でビューを完全に構成することができます。上記の使用方法がもう少し明確であることがわかります。
ボーナスとして、以下も入手できます。
- ログイン認証チェック (pass
login_required=True
)
- からの成功ステータス メッセージ
django.contrib.messages
。
- エラーをチェックするコードが少なくなります。
- の代わりにパラメータを指定
ModelForm
した場合のデフォルト。model
form_class
のtemplate_name
デフォルトは「appname/model_form.html」ですが、私には少し多すぎます。
両方が共有するフォームクラスは次のとおりです。
class ContextForm(forms.ModelForm):
"""The form for a context"""
class Meta:
model = Context
exclude = ('collection',)
def save(self, commit=True):
"""Overwritten save to force collection_id to a value"""
model = super(ContextForm, self).save(commit=False)
model.collection_id = 1
if commit:
model.save()
return model