Le visualizzazioni generiche consentono di scrivere codice molto più breve.
Confronta:
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})
con:
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")
)
come le vostre opinioni normali, sono funzioni normali. È possibile configurare completamente la vista in URLconf, se lo si desidera, grazie a questo aspetto mi sembra un po 'più chiaro.
come bonus, si ottiene anche:
- Entra controlli di autenticazione (passa il
login_required=True
)
- messaggio di stato successo da
django.contrib.messages
.
- Meno codice per verificare la presenza di errori.
- Un valore predefinito
ModelForm
quando si fornisce un parametro model
anziché form_class
.
Il template_name
ha un valore predefinito "appname/model_form.html", ma è un po 'troppo per me.
Ecco la classe form entrambi condividono:
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
Grazie, TM. Dovrebbero aggiungere questo alla documentazione :). Comunque non sono completamente venduto su viste generiche. Il tuo esempio che riguarda direct_to_template non salva molto codice (2 righe) e devi ancora specificare manualmente il modello. La parte peggiore è che rende la tua applicazione un po 'più difficile da capire, perché richiede che io conosca meglio Django di quanto sia necessario per fare questo semplice compito. – allyourcode
@allyourcode Con le viste più complicate si sta per risparmiare molto più codice, ho scelto un esempio molto rapido. Inoltre, per quelle viste che operano su modelli, selezioneranno automaticamente un modello basato su una convenzione di denominazione (o può essere sovrascritto se non si desidera seguire la convenzione). Vedi http://docs.djangoproject.com/en/1.1/ref/generic-views/ per ulteriori esempi. Raccomando di scrivere alcune di queste viste da zero e quindi confrontarle. Nessuno di loro è enorme e complicato, è solo una cosa in meno da scrivere e fare il debug. –
Grazie ancora, TM. Stavo già guardando i documenti per la versione di sviluppo di Django. – allyourcode