Las vistas genéricas te permiten escribir códigos mucho más cortos.
Compare:
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")
)
Al igual que sus puntos de vista normales, que son funciones simplemente normales. Es posible configurar la vista completamente en el URLconf si lo desea, a través de este uso me resulta un poco más claro.
Como beneficio adicional, también puede obtener:
- Iniciar sesión comprobaciones de autenticación (pasan
login_required=True
)
- mensaje de estado de éxito
django.contrib.messages
.
- Menos código para comprobar si hay errores.
- Valor predeterminado
ModelForm
cuando proporciona un parámetro model
en lugar de form_class
.
El template_name
tiene un valor predeterminado de "nombre de aplicación/modelo_forma.html", pero eso es demasiado para mí.
Aquí es la clase de forma que ambos comparten:
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
Gracias, TM. Deberían agregar esto a la documentación :). Aunque no estoy completamente vendido en vistas genéricas. Su ejemplo que implica direct_to_template no ahorra mucho código (2 líneas), y todavía tiene que especificar manualmente la plantilla. La parte mala es que hace que su aplicación sea un poco más difícil de entender, porque requiere que sepa más sobre Django de lo que es necesario para realizar esta simple tarea. – allyourcode
@allyourcode Con vistas más complicadas puedes guardar mucho más código, elegí un ejemplo muy rápido. Además, para aquellas vistas que operan en modelos, seleccionarán automáticamente una plantilla basada en una convención de nomenclatura (o puede anularse si no quiere seguir la convención). Ver http://docs.djangoproject.com/en/1.1/ref/generic-views/ para más ejemplos. Recomiendo escribir algunas de estas vistas desde cero y luego compararlas. Ninguno de ellos es enorme y complicado, es solo una cosa menos que escribir y depurar. –
Gracias de nuevo, TM. Ya estaba viendo los documentos para la versión de desarrollo de Django. – allyourcode