Vistas genéricas basadas en clases Django (Crear, Recuperar, Actualizar, Eliminar)

Django es un marco web basado en Python que le permite crear rápidamente aplicaciones web. Tiene una interfaz de administración incorporada que facilita el trabajo con él. A menudo se denomina marco de trabajo de baterías incluidas porque proporciona funciones integradas para cada funcionalidad. Las vistas genéricas basadas en clases son un conjunto avanzado de vistas integradas que se utilizan para la implementación de estrategias de vista selectiva, como Crear, Recuperar, Actualizar, Eliminar. Las vistas basadas en clases simplifican el uso al separar las requests GET y POST para una vista. No reemplazan las vistas basadas en funciones, pero tienen ciertas diferencias y ventajas en comparación con las vistas basadas en funciones:

  • La organización del código relacionado con métodos HTTP específicos (GET, POST, etc.) se puede abordar mediante métodos separados en lugar de bifurcaciones condicionales.
  • Las técnicas orientadas a objetos, como mixins (herencia múltiple), se pueden usar para factorizar el código en componentes reutilizables.

Este artículo gira en torno a la implementación completa de Vistas basadas en clases en Django (Crear, Recuperar, Actualizar, Eliminar). Analicemos lo que realmente significa CRUD,

Untitled-Diagram-316

CreateView : cree o agregue nuevas entradas en una tabla en la base de datos. 
Recuperar vistas : lea, recupere, busque o vea las entradas existentes como una lista ( ListView ) o recupere una entrada particular en detalle ( DetailView
UpdateView : actualice o edite las entradas existentes en una tabla en la base de datos 
DeleteView : elimine, desactive o elimine entradas existentes en una tabla en la base de datos 
FormView : renderice un formulario en una plantilla y maneje los datos ingresados ​​por el usuario

Django CRUD (Crear, Recuperar, Actualizar, Eliminar) Vistas basadas en clases

Ilustración de cómo crear y usar vistas CRUD usando un ejemplo. Considere un proyecto llamado geeksforgeeks que tenga una aplicación llamada geeks.  

Consulte los siguientes artículos para comprobar cómo crear un proyecto y una aplicación en Django. 

Después de tener un proyecto y una aplicación, creemos un modelo del cual crearemos instancias a través de nuestra vista. En geeks/models.py,  

Python3

# import the standard Django Model
# from built-in library
from django.db import models
  
# declare a new model with a name "GeeksModel"
class GeeksModel(models.Model):
 
    # fields of the model
    title = models.CharField(max_length = 200)
    description = models.TextField()
 
    # renames the instances of the model
    # with their title name
    def __str__(self):
        return self.title

Después de crear este modelo, necesitamos ejecutar dos comandos para crear la base de datos para el mismo. 

Python manage.py makemigrations
Python manage.py migrate

Ahora crearemos un Django ModelForm para este modelo. Consulte este artículo para obtener más información sobre modelform – Django ModelForm – Crear formulario a partir de modelos . crear un archivo forms.py en la carpeta geeks,  

Python3

from django import forms
from .models import GeeksModel
 
 
# creating a form
class GeeksForm(forms.ModelForm):
 
    # create meta class
    class Meta:
        # specify model to be used
        model = GeeksModel
 
        # specify fields to be used
        fields = [
            "title",
            "description",
        ]

Uso de vistas basadas en clases

En esencia, una vista basada en clases le permite responder a diferentes métodos de solicitud HTTP con diferentes métodos de instancia de clase, en lugar de con un código de bifurcación condicional dentro de una sola función de vista.

Entonces, donde el código para manejar HTTP GET en una función de vista se vería así: 

Python3

from django.http import HttpResponse
 
def my_view(request):
    if request.method == 'GET':
        # <view logic>
        return HttpResponse('result')

En una vista basada en clases, esto se convertiría en:

Python3

from django.http import HttpResponse
from django.views import View
 
class MyView(View):
    def get(self, request):
        # <view logic>
        return HttpResponse('result')

De manera similar, en urls.py, se necesita usar el método as_view() para diferenciar una vista basada en clases de una vista basada en funciones. 

Python3

# urls.py
from django.urls import path
from myapp.views import MyView
 
urlpatterns = [
 
    path('about/', MyView.as_view()),
 
]

CreateView

Crear vista se refiere a una vista (lógica) para crear una instancia de una tabla en la base de datos. Ya hemos discutido los conceptos básicos de Create View en Create View – Vistas basadas en funciones Django. Las vistas basadas en clases configuran automáticamente todo, desde la A hasta la Z. Solo se necesita especificar para qué modelo crear Crear vista y los campos. Luego, CreateView basado en clases intentará automáticamente encontrar una plantilla en app_name/modelname_form.html. En nuestro caso es geeks/templates/geeks/geeksmodel_form.html. Vamos a crear nuestra vista basada en clases. En geeks/views.py, 

Python3

from django.views.generic.edit import CreateView
from .models import GeeksModel
 
class GeeksCreate(CreateView):
 
    # specify the model for create view
    model = GeeksModel
 
    # specify the fields to be displayed
 
    fields = ['title', 'description']

Ahora cree una ruta de URL para mapear la vista. En geeks/urls.py, 

Python3

from django.urls import path
 
# importing views from views..py
from .views import GeeksCreate
urlpatterns = [
    path('', GeeksCreate.as_view() ),
]

Cree una plantilla en templates/geeks/geeksmodel_form.html, 

HTML

<form method="POST" enctype="multipart/form-data">
 
    <!-- Security token -->
    {% csrf_token %}
 
    <!-- Using the formset -->
    {{ form.as_p }}
     
    <input type="submit" value="Submit">
</form>

Veamos qué hay en http://localhost:8000/ 

django-create-view-function-based

Para verificar la implementación completa de CreateView basado en clases, visite Createview – Vistas basadas en clases Django

Recuperar vistas

Vista de la lista

Vista de lista se refiere a una vista (lógica) para mostrar varias instancias de una tabla en la base de datos. Ya hemos discutido los conceptos básicos de Vista de lista en Vista de lista – Vistas basadas en funciones Django . Las vistas basadas en clases configuran automáticamente todo, desde la A hasta la Z. Solo se necesita especificar para qué modelo crear ListView, luego ListView basado en clases intentará encontrar una plantilla automáticamente en app_name/modelname_list.html. En nuestro caso es geeks/templates/geeks/geeksmodel_list.html. Vamos a crear nuestra vista basada en clases. En geeks/views.py, 

Python3

from django.views.generic.list import ListView
from .models import GeeksModel
 
class GeeksList(ListView):
 
    # specify the model for list view
    model = GeeksModel

Ahora cree una ruta de URL para mapear la vista. En geeks/urls.py, 

Python3

from django.urls import path
 
# importing views from views..py
from .views import GeeksList
urlpatterns = [
    path('', GeeksList.as_view()),
]

Cree una plantilla en templates/geeks/geeksmodel_list.html, 

HTML

<ul>
    <!-- Iterate over object_list -->
    {% for object in object_list %}
    <!-- Display Objects -->
    <li>{{ object.title }}</li>
    <li>{{ object.description }}</li>
 
    <hr/>
    <!-- If object_list is empty  -->
    {% empty %}
    <li>No objects yet.</li>
    {% endfor %}
</ul>

Veamos qué hay en http://localhost:8000/ 

django-listview-class-based-views

Para verificar la implementación completa de ListView basado en clases, visite ListView – Vistas basadas en clases Django

Vista de detalles

Vista detallada se refiere a una vista (lógica) para mostrar una instancia de una tabla en la base de datos. Ya hemos discutido los conceptos básicos de la Vista detallada en Vista detallada – Vistas basadas en funciones Django . Las vistas basadas en clases configuran automáticamente todo, desde la A hasta la Z. Solo se necesita especificar para qué modelo crear DetailView, luego DetailView basado en clases intentará automáticamente encontrar una plantilla en app_name/modelname_detail.html. En nuestro caso es geeks/templates/geeks/geeksmodel_detail.html. Vamos a crear nuestra vista basada en clases. En geeks/views.py, 

Python3

from django.views.generic.detail import DetailView
 
from .models import GeeksModel
 
class GeeksDetailView(DetailView):
    # specify the model to use
    model = GeeksModel

Ahora cree una ruta de URL para mapear la vista. En geeks/urls.py, 

Python3

from django.urls import path
 
# importing views from views..py
from .views import GeeksDetailView
urlpatterns = [
    # <pk> is identification for id field,
    # slug can also be used
    path('<pk>/', GeeksDetailView.as_view()),
]

Cree una plantilla en templates/geeks/geeksmodel_detail.html, 

HTML

<h1>{{ object.title }}</h1>
 
 
 
<p>{{ object.description }}</p>

Veamos qué hay en http://localhost:8000/1/ 

django-detailview-class-based

Para verificar la implementación completa de DetailView basado en clases, visite DetailView – Vistas basadas en clases Django 

ActualizarVista

UpdateView se refiere a una vista (lógica) para actualizar una instancia particular de una tabla de la base de datos con algunos detalles adicionales. Se utiliza para actualizar entradas en la base de datos, por ejemplo, actualizando un artículo en geeksforgeeks. Ya hemos discutido los conceptos básicos de Actualizar Vista en Actualizar Vista – Vistas basadas en funciones Django . Las vistas basadas en clases configuran automáticamente todo, de la A a la Z. Solo se necesita especificar para qué modelo crear UpdateView, luego UpdateView basado en clases intentará automáticamente encontrar una plantilla en app_name/modelname_form.html. En nuestro caso es geeks/templates/geeks/geeksmodel_form.html. Vamos a crear nuestra vista basada en clases. En geeks/views.py, 

Python3

# import generic UpdateView
from django.views.generic.edit import UpdateView
 
# Relative import of GeeksModel
from .models import GeeksModel
 
class GeeksUpdateView(UpdateView):
    # specify the model you want to use
    model = GeeksModel
 
    # specify the fields
    fields = [
        "title",
        "description"
    ]
 
    # can specify success url
    # url to redirect after successfully
    # updating details
    success_url ="/"

Ahora cree una ruta de URL para mapear la vista. En geeks/urls.py, 

Python3

from django.urls import path
 
# importing views from views..py
from .views import GeeksUpdateView
urlpatterns = [
    # <pk> is identification for id field,
    # <slug> can also be used
    path('<pk>/update', GeeksUpdateView.as_view()),
]

Cree una plantilla en templates/geeks/geeksmodel_form.html, 

HTML

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save">
</form>

Veamos qué hay en http://localhost:8000/1/update/ 

django-updateview-class-based-view

Para verificar la implementación completa de UpdateView basado en clases, visite UpdateView – Vistas basadas en clases Django

EliminarVer

Eliminar vista se refiere a una vista (lógica) para eliminar una instancia particular de una tabla de la base de datos. Se utiliza para eliminar entradas en la base de datos, por ejemplo, eliminando un artículo en geeksforgeeks. Ya hemos discutido los conceptos básicos de Eliminar Vista en Eliminar Vista – Vistas basadas en funciones Django . Las vistas basadas en clases configuran automáticamente todo, desde la A hasta la Z. Uno solo necesita especificar para qué modelo crear DeleteView, luego DeleteViewde basado en clases intentará automáticamente encontrar una plantilla en app_name/modelname_confirm_delete.html. En nuestro caso es geeks/templates/geeks/geeksmodel_confirm_delete.html. Vamos a crear nuestra vista basada en clases. En geeks/views.py, 

Python3

# import generic UpdateView
from django.views.generic.edit import DeleteView
 
# Relative import of GeeksModel
from .models import GeeksModel
 
class GeeksDeleteView(DeleteView):
    # specify the model you want to use
    model = GeeksModel
     
    # can specify success url
    # url to redirect after successfully
    # deleting object
    success_url ="/"

Ahora cree una ruta de URL para mapear la vista. En geeks/urls.py, 

Python3

from django.urls import path
 
# importing views from views..py
from .views import GeeksDeleteView
urlpatterns = [
    # <pk> is identification for id field,
    # slug can also be used
    path('<pk>/delete/', GeeksDeleteView.as_view()),
]

Cree una plantilla en templates/geeks/geeksmodel_confirm_delete.html, 

HTML

<form method="post">{% csrf_token %}
     
 
 
<p>Are you sure you want to delete "{{ object }}"?</p>
 
 
 
    <input type="submit" value="Confirm">
</form>

Veamos qué hay en http://localhost:8000/1/delete 

django-deleteview-class-based-views

Para verificar la implementación completa de DeleteView basado en clases, visite DeleteView – Vistas basadas en clases Django

Vista de formulario

FormView se refiere a una vista (lógica) para mostrar y verificar un formulario Django. Por ejemplo, un formulario para registrar usuarios en geeksforgeeks. Las vistas basadas en clases configuran automáticamente todo, desde la A hasta la Z. Solo se necesita especificar para qué formulario crear FormView y template_name, luego FormView basado en clases representará automáticamente ese formulario. Vamos a crear nuestra vista basada en clases. En geeks/views.py,  

Python3

# import generic FormView
from django.views.generic.edit import FormView
 
# Relative import of GeeksForm
from .forms import GeeksForm
 
class GeeksFormView(FormView):
    # specify the Form you want to use
    form_class = GeeksForm
     
    # specify name of template
    template_name = "geeks / geeksmodel_form.html"
 
    # can specify success url
    # url to redirect after successfully
    # updating details
    success_url ="/thanks/"

Cree una plantilla para esta vista en geeks/geeksmodel_form.html, 

HTML

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save">
</form>

Asigne una URL a esta vista en geeks/urls.py, 

Python3

from django.urls import path
 
# importing views from views..py
from .views import GeeksFormView
urlpatterns = [
    path('', GeeksFormView.as_view()),
]

Ahora visite http://127.0.0.1:8000/

django-create-view-function-based

Para verificar la implementación completa de FormView basado en clases, visite FormView – Vistas basadas en clases Django
 

Publicación traducida automáticamente

Artículo escrito por NaveenArora y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *