modelos - modelform django
¿Cómo uso CreateView con un ModelForm? (1)
Aparece un error en mi clase AuthorCreateForm cuando envío mi formulario. NameError self no está definido
¿Cómo uso un CreateForm?
Creé una clase en mi archivo Author.py
from django.views.generic import TemplateView, ListView, CreateView
from books.models import Author, Publisher, Book
from books.forms import AuthorForm
class AuthorCreateView(CreateView):
objAuthorForm = AuthorForm(self.request.POST)
if(objAuthorForm.save()):
success = "Form saved!"
else:
error = "There was an error!"
y tengo una plantilla html que se envía a / Author / Create
y tengo la siguiente línea en mi urls.py
(''^authors/create/$'', Author.AuthorCreateView.as_view()),
Presto el formulario en esta URL
(''^authors/new/$'', TemplateView.as_view(template_name="author_new.html")),
Encuentro las vistas basadas en clases confusas, ¿alguien tiene un buen tutorial sobre cómo usarlo para las operaciones CRUD?
Gracias
Lo que tienes es un error de pitón: el self
no está definido. self
es generalmente lo que se refiere a la instancia de clase en sí misma en los métodos de clase.
De todos modos, estoy de acuerdo, es totalmente nuevo y no está documentado. Creo que mirar la fuente es absolutamente clave en este punto.
Para django.views.generic.base.View
cómodo con las vistas basadas en clases, comenzaría django.views.generic.base.View
, que implementa solo unos pocos métodos, es decir, intentar invocar una función en la clase en función del método de solicitud (publicar, obtener, cabeza, - mira la fuente).
Por ejemplo, aquí está el primer paso para reemplazar las funciones de vista con las nuevas clases de vista:
class MyClassBasedView(View):
def get(self, request):
# behave exactly like old style views
# except this is called only on get request
return http.HttpResponse("Get")
def post(self, request):
return http.HttpResponse("Post")
(r''^foobar/$'', MyClassBasedView.as_view())
De vuelta a tu pregunta específica:
Todo lo que hace TemplateView.as_view()
es renderizar la plantilla: CreateView
es una combinación de varias otras clases que manejan ModelForms
y la representación de plantillas ( TemplateView
).
Por lo tanto, para un ejemplo muy básico, busque en los documentos la clase mixins
utiliza CreateView
.
Vemos que implementa TemplateResponseMixin
, ModelFormMixin
y ProcessFormView
, cada uno con una lista de métodos para esas clases.
El CreateView más básico
En el nivel más básico, proporcione CreateView
de ModelFormMixin
con el modelo o la clase personalizada de ModelForm como se documenta aquí.
Su clase CreateView
se parecería a la siguiente
class AuthorCreateView(CreateView):
form_class = AuthorForm
template_name = ''author_new.html''
success_url = ''success''
Con esos 3 atributos principales establecidos, llámalo en tus URL.
(''^authors/create/$'', Author.AuthorCreateView.as_view()),
Renderice la página y verá su ModelForm pasado a la plantilla como form
, manejando el paso de validación de formulario (pasando request.POST
/ re-render si no es válido), así como llamando a form.save()
y redireccionando a success_url
.
Comience a anular los métodos de clase
Para personalizar el comportamiento, comience a anular los métodos documentados para los mixins
.
Recuerde que simplemente necesita devolver una HttpResponse
de uno de estos métodos como cualquier función de vista normal.
Ejemplo anulando form_invalid
documentado en ModelFormMixin
:
class AuthorCreateView(CreateView):
form_class = AuthorForm
template_name = ''author_new.html''
success_url = ''success''
def form_invalid(self, form):
return http.HttpResponse("form is invalid.. this is just an HttpResponse object")
Esta anulación por método comienza a ser extremadamente útil a medida que sus formularios crecen más avanzados y, finalmente, le permite crear formularios enormes con un puñado de líneas de código, anulando solo lo que sea necesario.
Supongamos que desea pasar los parámetros personalizados de su formulario, como el objeto de request
(muy común si necesita acceder al usuario en el formulario): solo necesita reemplazar a get_form_kwargs
.
class MyFormView(FormView):
def get_form_kwargs(self):
# pass "user" keyword argument with the current user to your form
kwargs = super(MyFormView, self).get_form_kwargs()
kwargs[''user''] = self.request.user
return kwargs
Las vistas basadas en clases son un ejemplo brillante del uso inteligente de clases. Me dio una gran introducción hacia la construcción de mis propios mixins para vistas y clases de Python en general. Está ahorrando incontables horas.
Wow esto tiene mucho tiempo. Pensar que comenzó como una mera URL al comentario de los doctores :) ¡Espero que ayude!