НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ

Django Підручник

Django Головна Django Інтро Django Почати навчання Створення віртуального середовища Встановити Django Django Створити проєкт Django Створити додаток Django Представлення Django URL Django Шаблони Django Моделі Django Вставити дані Django Оновити дані Django Видалити дані Django Оновити модель

Відображення даних

Підготовка шаблону і представлення Додати посилання на деталі Додати головний шаблон Додати головну Index сторінку Django 404 Шаблон Додати Test перегляд

Admin

Django Admin Створити користувача Включити учасника Відображення списку установок Оновити учасників Додати учасників Видалити учасників

Django Синтаксис

Django Змінні Django Теги Django If Else Django Цикл For Django Коментар Django Include

QuerySets

QuerySet Інтро QuerySet Get QuerySet Фільтр QuerySet Order By

Статичні файли

Додати статичні файли Встановити WhiteNoise Зібрати статичні файли Додати глобальні статичні файли Додати стилі до проєкту

PostgreSQL

PostgreSQL Інтро Створити обліковий запис AWS Створити базу даних у RDS Підключитися до бази даних Додати учасників

Розгортання Django

Elastic Beanstalk (EB) Створити requirements.txt Створити django.config Створити .zip файл Розгорнути із EB Оновити проєкт

Більше Django

Додати Slug Field Додати Bootstrap 5

Django Довідники

Довідник тегів шаблону Довідник фільтра Довідник Пошуку полів

Django Вправи

Django Компілятор Django Вправи Django Вікторина Django Сервер Django Сертифікат

Django. Уроки для початківців

En Es De

Django Slug поле


Що таке Slug?

Ви коли-небудь бачили URL-адресу, яка виглядає так:

w3schools.com/django/learn-about-slug-field

Частина "learn-about-slug-field" є slug (слаг).

Це опис, який містить лише літери, дефіси, цифри або підкреслення.

Він часто використовується в url, щоб полегшити їх читання, а також зробити їх більш зручними для пошукових систем.


URL-адреса без Slug

Якщо ви дотримувалися нашого проєкту Django, створеного в цьому підручнику, у вас буде невеликий проєкт Django, який виглядатиме так:

Django Members

І якщо ви натиснете першого учасника, ви перейдете на цю сторінку:

Django details

Перевірте адресний рядок:

127.0.0.1:8000/members/details/1

Число "1" означає ідентифікатор цього конкретного запису в базі даних.

Це має сенс для розробника, але, ймовірно, ні для когось іншого.


URL-адреса зі Slug

Було б більш логічно, якби URL-адреса виглядала так:

Django details

Перевірте адресний рядок:

127.0.0.1:8000/members/details/emil-refsnes

Це більш зручна URL-адреса, і Django може допомогти вам створити таку URL-адресу у вашому проєкті.


Змініть файл models.py

Почніть із додавання нового поля в базу даних.

Відкрийте файл models.py та додайте поле під назвою slug із типом даних SlugField:

my_tennis_club/members/models.py:

from django.db import models

class Member(models.Model):
  firstname = models.CharField(max_length=255)
  lastname = models.CharField(max_length=255)
  phone = models.IntegerField(null=True)
  joined_date = models.DateField(null=True)
  slug = models.SlugField(default="", null=False)

  def __str__(self):
    return f"{self.firstname} {self.lastname}"

Це зміна в структурі моделі, тому ми повинні виконати міграцію, щоб повідомити Django, що він має оновити базу даних:

py manage.py makemigrations

І команда міграції:

py manage.py migrate

Змінити адміністратора

Тепер у нас є нове поле в базі даних, але ми також хочемо, щоб це поле оновлювалося автоматично, коли ми встановлюємо ім’я чи прізвище учасника.

Це можна зробити за допомогою вбудованої функції Django під назвою prepopulated_fields, де ви вказуєте поле, яке потрібно попередньо заповнити, і кортеж із полями), яким ви хочете його заповнити.

Це робиться у файлі admin.py:

my_tennis_club/members/admin.py:

from django.contrib import admin
from .models import Member

# Зареєструйте свої моделі тут

class MemberAdmin(admin.ModelAdmin):
  list_display = ("firstname", "lastname", "joined_date",)
  prepopulated_fields = {"slug": ("firstname", "lastname")}

admin.site.register(Member, MemberAdmin)

Увійдіть в інтерфейс адміністратора та відкрийте запис для редагування:

Admin slug

Натисніть "SAVE" ("ЗБЕРЕГТИ"), і поле "slug" буде автоматично заповнено ім’ям і прізвищем, а оскільки поле "slug" має тип SlugField, воно має "slugify" значення, тобто між кожним словом буде поставлено дефіс.

Наступного разу, коли ви відкриєте елемент для редагування, ви побачите поле slug зі значенням:

Admin slug

Примітка: Оскільки нове поле порожнє за замовчуванням, вам потрібно виконати цю операцію збереження для кожного учасника.


Змінити шаблон

Тепер ми можемо замінити поле ID полем slug у всьому проєкті.

Почніть із шаблону all_members.html, де є посилання на сторінку деталей:

my_tennis_club/members/templates/all_members.html:

{% extends "master.html" %}

{% block title %}
  My Tennis Club - List of all members
{% endblock %}

{% block content %}
  <div class="mycard">
    <h1>Members</h1>
    <ul>
      {% for x in mymembers %}
        <li onclick="window.location = 'details/{{ x.slug }}'">{{ x.firstname }} {{ x.lastname }}</li>
      {% endfor %}
    </ul>
  </div>
{% endblock %}

Змінити URL

Ми також маємо внести деякі зміни у файл urls.py.

Змінити з <int:id> на <slug:slug>:

my_tennis_club/members/urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.main, name='main'),
    path('members/', views.members, name='members'),
    path('members/details/<slug:slug>', views.details, name='details'),
    path('testing/', views.testing, name='testing'),
]

Змінити вигляд

Зрештою, змініть представлення details, щоб обробляти вхідний запит як slug замість ID:

my_tennis_club/members/views.py:

from django.http import HttpResponse
from django.template import loader
from .models import Member

def members(request):
  mymembers = Member.objects.all().values()
  template = loader.get_template('all_members.html')
  context = {
    'mymembers': mymembers,
  }
  return HttpResponse(template.render(context, request))

def details(request, slug):
  mymember = Member.objects.get(slug=slug)
  template = loader.get_template('details.html')
  context = {
    'mymember': mymember,
  }
  return HttpResponse(template.render(context, request))

def main(request):
  template = loader.get_template('main.html')
  return HttpResponse(template.render())

def testing(request):
  template = loader.get_template('template.html')
  context = {
    'fruits': ['Apple', 'Banana', 'Cherry'],
  }
  return HttpResponse(template.render(context, request))

Тепер посилання на деталі працює з новою URL-адресою slugified:

Django details

Якщо ви виконали всі кроки на своєму комп’ютері, ви можете побачити результат у своєму браузері: 127.0.0.1:8000/members/.

Якщо сервер не працює, його потрібно запустити знову за допомогою команди runserver:

py manage.py runserver


Коментарі