partir modelos formularios fields createview avanzados django django-views

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!