Списки отображаются на странице списков. Однако единственный способ создать списки — через панель администратора, поэтому следующим шагом будет создание формы для пользователей, чтобы они могли вводить новые списки прямо на веб-сайте.

Процесс создания будет URL ›› Форма ›› Вид ›› Шаблон.

URL-адрес нового листинга

Откройте urls.py и добавьте путь к новой странице со списком.

#listings/urls.py 
              
from django.urls import path
from .import views
app_name = 'listings' 
urlpatterns = [
    path(' ', views.index, name='index'),
    path('all_listings/', views.all_listings, name='all_listings'),
    path('new_listing/', views.new_listing, name='new_listing'),
]

Новая форма листинга

Теперь займемся созданием новой формы листинга. Создайте файл с именем forms.py в каталоге объявлений.

PROJECT
└── example
├── listings
│ ├── migrations
│ ├── templates/listings
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── venv 
└── manage.py

Откройте forms.py и добавьте следующий код.

#listings/forms.py 
  
from django import forms 
from .models import Listings
class ListingForm(forms.ModelForm):
    class Meta:
        model = Listings
        fields = ['title', 'condition', 'product_type',
                 'sale_type', 'price', 'main_photo', 
                 'photo_1', 'photo_2', 'city',
                 'state', 'zipcode', 'contact_email'
                 ]

из форм импорта django

Этот модуль позволяет создавать формы с использованием класса ModelForm.

из .models import Listings

Нам нужны данные из модели Listings для создания формы, поэтому мы их импортируем.

метакласс

Настраивает форму в соответствии с моделью Listings.

Новый просмотр списка

Откройте views.py и добавьте следующий код.

#listings/views.py 
from django.shortcuts import render, redirect
from .forms import ListingForm
from .models import Listings
...
def new_listing(request):
    if request.method != 'POST': 
        form = ListingForm()
    else:
        form = ListingForm(request.POST, request.FILES) 
        if form.is_valid():
            form.save()
            return redirect('listings:all_listings')
            
    context = {'form': form}
    return render(request, 'listings/new_listing.html', context)

Таким образом, мы определили функцию с именем new_listing и используем операторы if и else для отображения формы, позволяющей пользователям отправлять данные, однако давайте подробнее рассмотрим код.

if request.method != ‘POST’: form = form_name()

Причина использования != 'POST' заключается в том, что для отображения пустой формы пользователи всегда будут сначала запрашивать данные с сервера, и это запрос GET.

else: form = ListingForm(request.POST, request.FILES) if form.is_valid(): form.save() return redirect(‘listings:all_listings’)

Пользователи видят пустую форму. Как только они заполнят его и отправят, приведенный выше код будет запущен.

form = ListingForm(запрос.POST, запрос.ФАЙЛЫ)

Переменная form содержит данные, отправляемые пользователем, request.POST отвечает за данные, а request.FILES отвечает за отправляемые файлы, в данном случае файлы изображений.

если form.is_valid():

Проверяет правильность информации в форме с помощью метода is_valid(). Этот метод проверяет, заполнены ли все обязательные поля, максимальная длина полей, соответствие типов полей данных и многое другое.

form.save()

Если форма действительна, используйте save() для записи данных из формы в базу данных.

обратное перенаправление(‘listings:all_listings’)

После того, как вся информация в форме будет проверена и отправлена, перейдите к перенаправлению пользователей на страницу с объявлениями. Вы можете перенаправить пользователей на другую страницу, если хотите.

context = {‘form’: form}return render(запрос, ‘listings/new_listing.html’, контекст)

Сохраняет переменную form в словаре и передает ее шаблону new_listing.

Новый шаблон листинга

Последним шагом является визуализация формы в шаблоне. Создайте шаблон с именем new_listing.html в папке шаблонов.

PROJECT
└── example
├── listings
│ ├── migrations
│ ├── templates/listings
│ │ ├── index.html
│ │ ├── all_listings.html
│ │ └── new_listing.html
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── venv 
└── manage.py

Откройте new_listing.html и добавьте следующий код.

#listings/templates/listings/new_listing.html
<h1>NEW LISTING</h1>
      
<form action="{% url 'listings:new_listing' %}" 
      method='post' 
      enctype="multipart/form-data">
  <div class="form-group">  
    {% csrf_token %}
    {{ form.as_p }}
  </div>
  <button type="submit" class="btn">Create Listing
  </button>
</form>

Аргумент action отправляет данные на URL-адрес функции представления new_listing. В этом представлении будут обрабатываться данные.

Аргумент method определяет, какой тип запроса отправляется, в данном случае запрос POST.

Также включите enctype="multipart/form-data" для отправки файлов изображений. Если мы не включим это, request.FILES будет пустым. При отправке только данных нет необходимости включать enctype.

{% csrf_token %}

Токен межсайтовых подделок запросов (csrf) — это мера безопасности, которая должна быть включена в любую форму POST.

{{ form.as_p }}

Встроенный тег шаблона {{ form }} уже заботится об отображении меток и полей ввода формы. Мы добавили as_p для отображения полей формы, заключенных в теги абзаца.

Введите python manage.py runserver и перейдите на http://127.0.0.1:8000/new_listing/.

Если вы не видите форму, вернитесь к главе и устраните возможные проблемы.

Попробуйте форму, создав еще несколько объявлений. После того, как вы отправите форму, вы должны быть перенаправлены на страницу списков, где вы можете увидеть новые добавленные списки.

Если вам нравится сериал, следите за мной в Twitter и на Youtube, чтобы узнать больше.

Youtube: Брайам Лоайза

Твиттер: balt1794