Les vues génériques vous permettent d'écrire du code beaucoup plus court.
Comparez:
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})
avec:
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")
)
Comme vos vues normales, ils ne sont que des fonctions normales. Il est possible de configurer la vue complètement dans l'URLconf si vous le souhaitez, à travers je trouve cet usage ci-dessus un peu plus clair.
En prime, vous obtenez également:
- contrôles d'authentification de connexion (passe
login_required=True
)
- état de réussite message de
django.contrib.messages
.
- Moins de code pour vérifier les erreurs.
- Valeur par défaut
ModelForm
lorsque vous indiquez un paramètre model
au lieu de form_class
.
Le template_name
a par défaut "appname/model_form.html", mais c'est un peu trop pour moi.
est ici la classe forme les deux actions:
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
Merci, TM. Ils devraient ajouter ceci à la documentation :). Cependant, je ne suis pas complètement vendu sur des vues génériques. Votre exemple impliquant direct_to_template n'économise pas beaucoup de code (2 lignes), et vous devez toujours spécifier manuellement le modèle. La mauvaise partie est que cela rend votre application un peu plus difficile à comprendre, car il faut que j'en sache plus sur Django que nécessaire pour accomplir cette tâche simple. – allyourcode
@allyourcode Avec des vues plus compliquées vous économisez beaucoup plus de code, j'ai choisi un exemple très rapide. En outre, pour les vues qui fonctionnent sur des modèles, ils sélectionnent automatiquement un modèle basé sur une convention de dénomination (ou peuvent être remplacés si vous ne voulez pas suivre la convention). Voir http://docs.djangoproject.com/fr/1.1/ref/generic-views/ pour plus d'exemples. Je recommande d'écrire certaines de ces vues à partir de zéro, puis de comparer. Aucun d'eux n'est énorme et compliqué, c'est juste une chose de moins à écrire et à déboguer. –
Merci encore, TM. Je regardais déjà les docs pour la version de développement de Django. – allyourcode