Общие представления позволяют писать гораздо более короткий код.
Сравнить:
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, если хотите, я нахожу это использование выше немного более понятным.
Как БОНУС, вы также получите:
- Вход проверки подлинности (передвигайте
login_required=True
)
- Success статусное сообщение от
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
Благодаря ТМ. Они должны добавить это в документацию :). Хотя я не полностью продается на общих представлениях. Ваш пример с участием direct_to_template не сэкономит много кода (2 строки), и вам все равно придется вручную указать шаблон. Плохая часть заключается в том, что это затрудняет понимание вашего приложения, потому что для этого требуется, чтобы я знал больше о Django, чем это необходимо для выполнения этой простой задачи. – allyourcode
@allyourcode С более сложными представлениями вы стоите сохранить намного больше кода, я выбрал очень быстрый пример. Кроме того, для тех представлений, которые работают с моделями, они автоматически выбирают шаблон на основе соглашения об именах (или его можно переопределить, если вы не хотите следовать соглашению). Подробнее см. Http://docs.djangoproject.com/en/1.1/ref/generic-views/. Я рекомендую писать некоторые из этих просмотров с нуля, а затем сравнивать. Ни один из них не является огромным и сложным, это всего лишь одна вещь для написания и отладки. –
Еще раз спасибо, TM. Я уже смотрел документы для версии Django. – allyourcode