Универсальные представления на основе классов Django (создание, получение, обновление, удаление)

Опубликовано: 24 Февраля, 2022

Django - это веб-фреймворк на основе Python, который позволяет быстро создавать веб-приложения. Он имеет встроенный интерфейс администратора, который упрощает работу с ним. Его часто называют фреймворком с включенными батареями, потому что он предоставляет встроенные средства для каждой функции. Базовые представления на основе классов - это расширенный набор встроенных представлений, которые используются для реализации стратегий выборочного представления, таких как создание, получение, обновление, удаление. Представления на основе классов упрощают использование, разделяя запросы GET и POST для представления. Они не заменяют функциональные представления, но имеют определенные отличия и преимущества по сравнению с функциональными представлениями:

  • Организация кода, связанного с конкретными методами HTTP (GET, POST и т. Д.), Может быть решена отдельными методами вместо условного перехода.
  • Объектно-ориентированные методы, такие как миксины (множественное наследование), могут использоваться для разделения кода на повторно используемые компоненты.

Эта статья посвящена полной реализации представлений на основе классов в Django (создание, получение, обновление, удаление). Давайте обсудим, что на самом деле означает CRUD,

CreateView - создавать или добавлять новые записи в таблицу в базе данных.
Получение представлений - чтение, получение, поиск или просмотр существующих записей в виде списка (ListView) или получение подробной информации о конкретной записи (DetailView)
UpdateView - обновить или отредактировать существующие записи в таблице в базе данных
DeleteView - удалить, деактивировать или удалить существующие записи в таблице в базе данных.
FormView - отображать форму в шаблоне и обрабатывать данные, введенные пользователем

Django CRUD (создание, получение, обновление, удаление) представлений на основе классов

Иллюстрация того, как создавать и использовать представления CRUD на примере. Рассмотрим проект под названием geeksforgeeks, в котором есть приложение под названием geeks.

Refer to the following articles to check how to create a project and an app in Django. 
 

  • How to Create a Basic Project using MVT in Django?
  • How to Create an App in Django ?

After you have a project and an app, let’s create a model of which we will be creating instances through our view. In 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

После создания этой модели нам нужно запустить две команды, чтобы создать для нее базу данных.

 Python manage.py makemigrations
Python manage.py migrate

Now we will create a Django ModelForm for this model. Refer this article for more on modelform – Django ModelForm – Create form from Models. create a file forms.py in geeks folder, 
 

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",
        ]

Using Class Based Views

At its core, a class-based view allows you to respond to different HTTP request methods with different class instance methods, instead of with conditionally branching code inside a single view function.
So where the code to handle HTTP GET in a view function would look something like: 
 

Python3

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

In a class-based view, this would become:
 

Python3

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

Точно так же в urls.py нужно использовать метод as_view (), чтобы отличить представление на основе класса от представления на основе функций.

CreateView

Create View refers to a view (logic) to create an instance of a table in the database. We have already discussed basics of Create View in Create View – Function based Views Django. Class Based Views automatically setup everything from A to Z. One just needs to specify which model to create Create View for and the fields. Then Class based CreateView will automatically try to find a template in app_name/modelname_form.html. In our case it is geeks/templates/geeks/geeksmodel_form.html. Let’s create our class based view. In 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"]

Now create a url path to map the view. In geeks/urls.py, 
 

Python3

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

Create a template in 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>

Проверим, что есть на http: // localhost: 8000 /

Чтобы проверить полную реализацию CreateView на основе классов, посетите Createview - Class Based Views Django.

Получить просмотры

Посмотреть список

List View refers to a view (logic) to display multiple instances of a table in the database. We have already discussed basics of List View in List View – Function based Views Django. Class Based Views automatically setup everything from A to Z. One just needs to specify which model to create ListView for, then Class based ListView will automatically try to find a template in app_name/modelname_list.html. In our case it is geeks/templates/geeks/geeksmodel_list.html. Let’s create our class based view. In 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

Now create a url path to map the view. In geeks/urls.py, 
 

Python3

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

Create a template in 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>

Проверим, что есть на http: // localhost: 8000 /

Чтобы проверить полную реализацию ListView на основе классов, посетите ListView - Class Based Views Django

Подробный просмотр

Detail View refers to a view (logic) to display one instances of a table in the database. We have already discussed basics of Detail View in Detail View – Function based Views Django. Class Based Views automatically setup everything from A to Z. One just needs to specify which model to create DetailView for, then Class based DetailView will automatically try to find a template in app_name/modelname_detail.html. In our case it is geeks/templates/geeks/geeksmodel_detail.html. Let’s create our class based view. In 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

Now create a url path to map the view. In 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()),
]

Create a template in templates/geeks/geeksmodel_detail.html, 
 

html

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

Проверим, что есть на http: // localhost: 8000/1 /

Чтобы проверить полную реализацию DetailView на основе классов, посетите страницу DetailView - представления на основе классов Django.

UpdateView

UpdateView refers to a view (logic) to update a particular instance of a table from the database with some extra details. It is used to update entries in the database for example, updating an article at geeksforgeeks. We have already discussed basics of Update View in Update View – Function based Views Django. Class Based Views automatically setup everything from A to Z. One just needs to specify which model to create UpdateView for, then Class based UpdateView will automatically try to find a template in app_name/modelname_form.html. In our case it is geeks/templates/geeks/geeksmodel_form.html. Let’s create our class based view. In 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 ="/"

Now create a url path to map the view. In 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()),
]

Create a template in templates/geeks/geeksmodel_form.html, 
 

html

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

Проверим, что есть на http: // localhost: 8000/1 / update /

Чтобы проверить полную реализацию UpdateView на основе классов, посетите UpdateView - Class Based Views Django.

DeleteView

Delete View refers to a view (logic) to delete a particular instance of a table from the database. It is used to delete entries in the database for example, deleting an article at geeksforgeeks. We have already discussed basics of Delete View in Delete View – Function based Views Django. Class Based Views automatically setup everything from A to Z. One just needs to specify which model to create DeleteView for, then Class based DeleteViewde will automatically try to find a template in app_name/modelname_confirm_delete.html. In our case it is geeks/templates/geeks/geeksmodel_confirm_delete.html. Let’s create our class based view. In 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 ="/"

Now create a url path to map the view. In 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()),
]

Create a template in 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>

Проверим, что есть на http: // localhost: 8000/1 / delete

.
Чтобы проверить полную реализацию DeleteView на основе классов, посетите DeleteView - Class Based Views Django

FormView

FormView refers to a view (logic) to display and verify a Django Form. For example a form to register users at geeksforgeeks. Class Based Views automatically setup everything from A to Z. One just needs to specify which form to create FormView for and template_name, then Class based FormView will automatically render that form. Let’s create our class based view. In 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
     
    # sepcify name of template
    template_name = "geeks / geeksmodel_form.html"
 
    # can specify success url
    # url to redirect after successfully
    # updating details
    success_url ="/thanks/"

Create a template for this view in geeks/geeksmodel_form.html, 
 

html

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

Map a url to this view in geeks/urls.py, 
 

Python3

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

Теперь посетите http://127.0.0.1:8000/,

Чтобы проверить полную реализацию FormView на основе классов, посетите FormView - Class Based Views Django

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.