Jenerik görünümleri çok daha kısa kod yazmak için izin verir.
karşılaştırın:
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})
ile: normal görünümler gibi
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")
)
, sadece normal fonksiyonları vardır. İsterseniz, bu kullanımı biraz daha açık olarak bulabilirsem, görünümü tamamen URLconf içinde yapılandırmak mümkündür.
BONUS olarak, aynı zamanda almak:
- Giriş kimlik doğrulaması kontrolleri
django.contrib.messages
den
- Başarı durum mesajı (
login_required=True
geçmesi).
- Hataların kontrol edilmesi için daha az kod.
form_class
yerine model
parametresi sağladığınızda varsayılan ModelForm
.
template_name
, "appname/model_form.html" varsayılanına sahiptir, ancak bu benim için biraz fazladır.
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
sayesinde TM: Burada
formu sınıf ikisi de payıdır. Bunu belgelere eklemeliler :). Yine de genel görünümlerde satılmadım. Direct_to_template içeren örneğiniz fazla kod (2 satır) kaydetmez ve yine de şablonu manuel olarak belirtmeniz gerekir. Kötü olan bölüm, uygulamanızı anlamak için biraz daha zorlaştırmasıdır, çünkü bu basit görevi gerçekleştirmek için gerekli olandan daha çok Django'yu bilmem gerekiyor. – allyourcode
@allyourcode Daha karmaşık görünümlerle çok daha fazla kod kaydetmek için durursunuz, çok hızlı bir örnek seçtim. Ayrıca, modellerde çalışan bu görünümler için, bir adlandırma kuralı temelinde bir şablonu otomatik olarak seçer (veya sözleşmeyi izlemek istemiyorsanız geçersiz kılınabilir). Daha fazla örnek için http://docs.djangoproject.com/en/1.1/ref/generic-views/ adresine bakın. Bu görüntülerin bazılarını sıfırdan yazmanızı ve sonra karşılaştırmanızı tavsiye ederim. Hiçbiri devasa ve karmaşık değil, yazmak ve hata ayıklamak için sadece bir şey daha az. –
Tekrar teşekkürler, TM. Zaten Django'nun geliştirme sürümü için doktora bakıyordum. – allyourcode