#22. Слаги (slug) в URL-адресах. Метод get_absolute_url() | Уроки по Django 4

Поділитися
Вставка
  • Опубліковано 15 вер 2024
  • Практический курс по Django: stepik.org/a/1...
    Телеграм-канал Django: t.me/django_se...
    Инфо-сайт: proproprogs.ru...
    Что такое слаг (slug). Добавление поля SlugField в модель. Выборка и отображение записей по слагу.
    22_sitewomen.zip: github.com/sel...

КОМЕНТАРІ • 76

  • @user-cm1ri1sn2u
    @user-cm1ri1sn2u Рік тому +18

    Комментарий для продвижения канала и выражения благодарности Сергею, за всё, что он для нас делает

  • @vlad_gnom
    @vlad_gnom 4 місяці тому +3

    Очень хороший и интересный курс. Очень хочу научиться пользоваться фреймворком Django. Спасибо Сергею за большую помощь.❤

  • @AlexeySmykov
    @AlexeySmykov 11 місяців тому +5

    Замечательный курс. Очень хорошо, что автор развивает прошлый курс

  • @SVladimirov14
    @SVladimirov14 3 місяці тому +1

    Впервые за курсс появилось использование чего-то такого, чего раньше не объясняли - индексирование полей базы данных. Пришлось гуглить, и всё равно не до конца ещё понятно, мб будет понятно дальше. А так лайк авансом

  • @Lnx_Mint
    @Lnx_Mint 11 місяців тому +6

    Я весь сайт делаю на английском и у меня там имена без фамилий, поэтому я сразу сделала person.slug = person.title.
    Вообще после просмотра первого курса по Джанго стараюсь ставить видео на паузу и сначала сама стараюсь реализовать нужный функционал, а потом уже смотрю как автор объясняет.

    • @tercesterces1126
      @tercesterces1126 4 місяці тому

      Але спершу потрібно через метод replace() пробіли замінити на '-', інакше слаг буде з пробілом.
      In [4]: for w in Women.objects.all():
      ...: w.slug = str(w.title).replace(' ','-')
      ...: w.save()

  • @stensmitt
    @stensmitt 10 місяців тому +5

    Не благодарите)))
    andzhelina-dzholi
    margo-robbi
    dzhuliya-roberts
    ekaterina-guseva

  • @wasd1338
    @wasd1338 9 місяців тому +2

    то чувство, когда отдельный html для постов сделал для тренировки самостоятельно еще на том этапе, когда писали функцию-заглушку show_posts :D

  • @TheSuchov
    @TheSuchov Рік тому +6

    Чтобы "дважды не вставать" в консоли можно сразу прописать корректные slug выполнив импорт
    from pytils.translit import slugify
    for w in Women.objects.all():
    ...: w.slug = slugify(w.title)
    ...: w.save()
    предварительно установить pytils

    • @user-ym3yt1uq7s
      @user-ym3yt1uq7s 11 місяців тому +1

      Спасибо

    • @Zavintyshka
      @Zavintyshka 10 місяців тому

      Так метод slugify можно импортировать из ветки django.template.defaultfilters. Это в 11 уроке было

    • @TheSuchov
      @TheSuchov 10 місяців тому

      @@Zavintyshka
      У него проблемы с кириллицей

    • @Zavintyshka
      @Zavintyshka 10 місяців тому

      @@TheSuchov Тоже верно, но для url сойдет

    • @user-ue9tb6jx5e
      @user-ue9tb6jx5e 24 дні тому

      @@Zavintyshka только что попробовал вашим предложенным способом. Слаги не сформировались

  • @igorratnik2357
    @igorratnik2357 7 місяців тому +2

    1) Импортим либу: from transliterate import slugify
    2) Добавляем в модель магический метод:
    def __setattr__(self, key, value):
    if key != 'slug':
    super().__setattr__(key, value)
    if key == 'title':
    super().__setattr__('slug', slugify(value))
    Все, теперь, при добавлении новой записи или изменении поля 'title', у уже существующей записи, поле slug автоматически примет нужный красивый вид, не нужно руками ничего забивать, но жирный минус, что будет постоянное обращение к __setattr__ и постоянно подтягиваться библиотека slugify, что выльется в тормоза сайта. Поэтому можно проделать все- тоже самое, переопределив методы __new__ и __setattr__, чтобы обращение к данной библиотеке происходило только в момент создания новой записи.

  • @andredru4278
    @andredru4278 11 місяців тому +3

    Спасибо. Очень интересно и понятно.

  • @user-ym3yt1uq7s
    @user-ym3yt1uq7s 11 місяців тому +3

    Очень хорошо спасибо огромное!

  • @Имя-ю6й
    @Имя-ю6й 8 місяців тому +2

    Хороший курс.
    А есть ли возможность сделать так, что бы slug , используя yandex или google translate, автоматически переводил заголовок статьи?

  • @johnmazepa
    @johnmazepa Рік тому +3

    уроки, связанные с жонглированием переменными между файлами, - пока самые сложные

  • @mrduckvc
    @mrduckvc Рік тому +1

    В django есть специальный SlugField для slug-ов с удобным функционалом

  • @aston585
    @aston585 6 місяців тому +1

    Супер круто! СПАСИБО!!!

  • @zmerz
    @zmerz 11 місяців тому +3

    Не пойму, почему Women not defined, при запуске цикла в shell_plus

  • @astralvois4985
    @astralvois4985 3 дні тому

    мне потребовалось 2 часа чтобы понять что всё идет от счетчика р цикла for, который перебирает в posts у views
    тем не менее это по-прежнему подробное объяснение логики django, лучше я не видел

  • @devidbrown8176
    @devidbrown8176 8 місяців тому +2

    Кто знает, есть ли разница, если я прописал get_absolute_url вот так:
    def get_absolute_url(self):
    return reverse('post', args=(self.slug, ))
    Так тоже все работает и во вьюху попадает правильный аргумент и все ок.

  • @favorid6406
    @favorid6406 10 місяців тому +1

    А если непосредственно в самом sql колонку добавить вручную, миграцию уже делать не надо? Или как

  • @user-cm1ri1sn2u
    @user-cm1ri1sn2u Рік тому +1

    Наверное в шаблоне post.html (на 4:15) правильнее было бы написать {{ title }}, иначе этот ключ, передаваемый в контексте data не используется

    • @selfedu_rus
      @selfedu_rus  Рік тому +1

      используется в названии закладки

    • @user-cm1ri1sn2u
      @user-cm1ri1sn2u Рік тому

      @@selfedu_rus действительно, используется в базовом шаблоне

  • @vindy6136
    @vindy6136 4 місяці тому +1

    Можете сказать зачем мы пишем "title":post.title?
    На второй title у меня выводится ошибка, та и я сама не понимаю откуда берется.

  • @АнатолийСитников-х3г
    @АнатолийСитников-х3г 11 місяців тому +1

    Спасибо!

  • @SSk-kw9xw
    @SSk-kw9xw 11 місяців тому +1

    15:20 - Сергей, объясните пожалуйтса подробнее, почему замена 'posts': data_db на 'posts': posts исправила ошибку с работой ссылок на гравной странице. В чем разница была?

    • @selfedu_rus
      @selfedu_rus  11 місяців тому

      Потому что в словаре коллекции data_db нет метода get_absolute_url.

  • @johnmazepa
    @johnmazepa Рік тому +2

    6:34 - строки:
    slug = models.SlugField(..., db_index = True)
    и
    class Meta:
    indexes = [ models.Indexes ( fields = [ '-time_create' ] ) ]
    добавляют один и тот же функционал (индексирование) только для разных полей?

  • @ВторкинСлава
    @ВторкинСлава Рік тому +1

    Классный урок. А могли бы вы на уроке показать как в url подставить категорию. Например, у нас есть категория Актеры, и хотелось бы чтобы все статьи которые прикреплены к данной категории имели url: домен/актеры/название статьи

    • @selfedu_rus
      @selfedu_rus  Рік тому +1

      будет отображение статей по категориям

    • @ВторкинСлава
      @ВторкинСлава Рік тому +1

      @@selfedu_rus супер, буду ждать. Ваша подача на 5+!

    • @Имя-ю6й
      @Имя-ю6й 8 місяців тому

      @@ВторкинСлава У Вас получилось реализовать данный функционал?

  • @user-le6op1ht4y
    @user-le6op1ht4y Рік тому +1

    Спасибо большое!!!
    Сколько всего будет видео?

  • @OxoTHuK13
    @OxoTHuK13 9 місяців тому +1

    Досмотрел урок до конца, все сделал по нему и решил через shell-plus подобавлять еще постов в БД:
    Women.objects.create(title='Натали Портман', content='Биография Натали Портман')
    Django почему-то без проблем добавила новую запись в БД, хотя в модели указано поле slug = models.SlugField(max_length=255, unique=True, db_index=True)
    Почему shell не выдал ошибку, что не заполнено поле slug?

    • @devidbrown8176
      @devidbrown8176 8 місяців тому +1

      Вроде как, если через shell добавляешь то БД игнорит условия по заполнению полей. Возможно, что это касается только SQlite. Если я правильно понял, то SQlite довольно специфична)

    • @OxoTHuK13
      @OxoTHuK13 8 місяців тому

      ​@@devidbrown8176 Хм, странно. Ведь в самой БД, если ее открыть в SQLiteStudio, в схеме таблицы на данном поле указано "NOT NULL". Т.е. проверка должна происходить на уровне самой БД, а не на уровне Джанго.
      Сейчас для проверки открыл таблицу в SQLiteStudio, в одной из записей, удалил значение поля, которое должно быть NOT NULL, сохранил, думая, что БД выдаст ошибку, но все успешно сохранилось. Какой-то странный этот SQLite3 - ограничение есть, но оно никак не влияет. ((

  • @AntonUrKl
    @AntonUrKl Рік тому +1

    Странно, но не работает {% for p in post
    после замены на данные из базы.
    Всё несколько раз перепроверил. Просто пропускает как не итерируемый объект.

    • @AntonUrKl
      @AntonUrKl Рік тому

      Прошу прощения, нашёл свою ошибку, все ок)

  • @user-ig4or4by9e
    @user-ig4or4by9e 11 місяців тому +1

    У меня после изменения прямиком в Dbeaver, изменения не показываются в Django. То есть slug-1 работает, а angelina-jolie нет, хотя в database я изменил slug-1 на angelina_jolie. Мне помогло fetching all objects дважды: сначала all_objects = Women.objects.all(), потом еще раз all_objects = Women.objects.all()

    • @selfedu_rus
      @selfedu_rus  11 місяців тому +1

      Вы, неверное, после редкатирования поля в БД не сохранили ее?

    • @user-ig4or4by9e
      @user-ig4or4by9e 11 місяців тому

      @@selfedu_rus , и да, и нет. Я просто забыл включить Autocommit в Dbeaver. И после изменений в Dbeaver в самом Database, я забыл нажать на Commit. Все что я написал выше, не решает данную проблему) просто нужно было коммитнуть.

    • @user-ig4or4by9e
      @user-ig4or4by9e 11 місяців тому

      интересно еще то, что time_update не меняется при изменении базы данных прямиком с Dbeaver.

  • @ibrahimoglu
    @ibrahimoglu Рік тому +2

    👍

  • @user-op2br8xo8h
    @user-op2br8xo8h 11 місяців тому +1

    Интересно, а slugify будет работать через формы (шаблон)? то есть, не через админку

    • @selfedu_rus
      @selfedu_rus  11 місяців тому +1

      slugify - это функция в Django (Python) во фронте ее вызвать уже нельзя

  • @user-eo9kz8ru9d
    @user-eo9kz8ru9d 10 місяців тому +1

    Остановился на 10:00, завтра продолжу.

  • @beknazaruzbekov-dn6lx
    @beknazaruzbekov-dn6lx Рік тому +2

    Здравствуйте, можно сделать видео с созданием чата на django

    • @mrduckvc
      @mrduckvc Рік тому

      Тут уже будет работа с websocket-ом (django channels к примеру), а это объёмная тема. В контексте этих видео-уроков вряд-ли можно уместить такую тему

    • @beknazaruzbekov-dn6lx
      @beknazaruzbekov-dn6lx Рік тому

      @@mrduckvc да,но было бы круто если бы него ролик сделал бы

  • @showrun4747
    @showrun4747 Рік тому +1

    не упомянуто что вместо reverse() лучше использовать её ленивый аналог reverse_lazy()

    • @selfedu_rus
      @selfedu_rus  Рік тому +2

      об этом будет дальше, когда дойдем до классов представлений

  • @13-th_Lord
    @13-th_Lord 28 днів тому

    9:12 -- Почему этот цикл выдает ошибку, хоть и делал всё точь в точь как на видео?
    for p in Persons.objects.all():
    p.slug() = 'slug-'+str(p.pk)
    p.save()
    Вот текст ошибки:
    Cell In[3], line 2
    p.slug() = 'slug-'+str(p.pk)
    ^
    SyntaxError: cannot assign to function call

    • @13-th_Lord
      @13-th_Lord 28 днів тому

      Ошибка найдена -- во второй строке после slug зря скобки поставил (невнимательность иногда сильно мешает))

    • @selfedu_rus
      @selfedu_rus  28 днів тому +1

      наверное, так:
      p.slug = 'slug-'+str(p.pk)

    • @13-th_Lord
      @13-th_Lord 28 днів тому +1

      @@selfedu_rus Да, именно так))
      (Не сразу увидел ваш ответ, но именно ваш вариант прописания этой строки решил это дело))

  • @user-eo9kz8ru9d
    @user-eo9kz8ru9d 10 місяців тому

    Как в этом цикле делать отступы?

  • @VladimirGavr
    @VladimirGavr Рік тому +1

    У меня плохие новости. Бегет использует версию MySQL 5.7.21. А в джанго 4.2 уже нет поддержки этой версии, только 8ка…

    • @user-cm1ri1sn2u
      @user-cm1ri1sn2u Рік тому

      Что есть "Бегет"?

    • @zion4d
      @zion4d Рік тому

      ​@@user-cm1ri1sn2u хостинг провайдер

    • @VladimirGavr
      @VladimirGavr Рік тому

      @@user-cm1ri1sn2u это хостинг

    • @VladimirGavr
      @VladimirGavr Рік тому

      я установил версию Джанго 4.1

    • @harry_holland
      @harry_holland Рік тому

      кайф, когда есть собственная вдска

  • @obyeboshen
    @obyeboshen 11 місяців тому +1

    7:23 тут ошибки нет, миграцию создает, но потом при ее применении уже она возникнет

    • @obyeboshen
      @obyeboshen 11 місяців тому

      и почему-то еще если убрать blank=True, мигрирует с пустыми строками спокойно, интересно почему

  • @user-eo9kz8ru9d
    @user-eo9kz8ru9d 10 місяців тому

    Битый час бьюсь, ничего не выходит, пишет: django.core.exceptions.ImproperlyConfigured: WSGI application 'djangoProjectSB.wsgi.application' could not be loaded; Error importing module. Убрал все изменения связанные с функцией show_post и все равно не работает Как будто что-то сбилось, пробовал даже перегрузит пайчарм.

    • @user-eo9kz8ru9d
      @user-eo9kz8ru9d 10 місяців тому

      Нашел в чем дело, почему-то 'django_extensions', было еще прописано в настройках в MIDDLEWARE. А не только в INSTALLED_APP.