Я весь сайт делаю на английском и у меня там имена без фамилий, поэтому я сразу сделала person.slug = person.title. Вообще после просмотра первого курса по Джанго стараюсь ставить видео на паузу и сначала сама стараюсь реализовать нужный функционал, а потом уже смотрю как автор объясняет.
Але спершу потрібно через метод replace() пробіли замінити на '-', інакше слаг буде з пробілом. In [4]: for w in Women.objects.all(): ...: w.slug = str(w.title).replace(' ','-') ...: w.save()
Впервые за курсс появилось использование чего-то такого, чего раньше не объясняли - индексирование полей базы данных. Пришлось гуглить, и всё равно не до конца ещё понятно, мб будет понятно дальше. А так лайк авансом
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__, чтобы обращение к данной библиотеке происходило только в момент создания новой записи.
Кто знает, есть ли разница, если я прописал get_absolute_url вот так: def get_absolute_url(self): return reverse('post', args=(self.slug, )) Так тоже все работает и во вьюху попадает правильный аргумент и все ок.
Чтобы "дважды не вставать" в консоли можно сразу прописать корректные slug выполнив импорт from pytils.translit import slugify for w in Women.objects.all(): ...: w.slug = slugify(w.title) ...: w.save() предварительно установить pytils
мне потребовалось 2 часа чтобы понять что всё идет от счетчика р цикла for, который перебирает в posts у views тем не менее это по-прежнему подробное объяснение логики django, лучше я не видел
15:20 - Сергей, объясните пожалуйтса подробнее, почему замена 'posts': data_db на 'posts': posts исправила ошибку с работой ссылок на гравной странице. В чем разница была?
Классный урок. А могли бы вы на уроке показать как в url подставить категорию. Например, у нас есть категория Актеры, и хотелось бы чтобы все статьи которые прикреплены к данной категории имели url: домен/актеры/название статьи
Досмотрел урок до конца, все сделал по нему и решил через shell-plus подобавлять еще постов в БД: Women.objects.create(title='Натали Портман', content='Биография Натали Портман') Django почему-то без проблем добавила новую запись в БД, хотя в модели указано поле slug = models.SlugField(max_length=255, unique=True, db_index=True) Почему shell не выдал ошибку, что не заполнено поле slug?
Вроде как, если через shell добавляешь то БД игнорит условия по заполнению полей. Возможно, что это касается только SQlite. Если я правильно понял, то SQlite довольно специфична)
@@devidbrown8176 Хм, странно. Ведь в самой БД, если ее открыть в SQLiteStudio, в схеме таблицы на данном поле указано "NOT NULL". Т.е. проверка должна происходить на уровне самой БД, а не на уровне Джанго. Сейчас для проверки открыл таблицу в SQLiteStudio, в одной из записей, удалил значение поля, которое должно быть NOT NULL, сохранил, думая, что БД выдаст ошибку, но все успешно сохранилось. Какой-то странный этот SQLite3 - ограничение есть, но оно никак не влияет. ((
У меня после изменения прямиком в 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 , и да, и нет. Я просто забыл включить Autocommit в Dbeaver. И после изменений в Dbeaver в самом Database, я забыл нажать на Commit. Все что я написал выше, не решает данную проблему) просто нужно было коммитнуть.
6:34 - строки: slug = models.SlugField(..., db_index = True) и class Meta: indexes = [ models.Indexes ( fields = [ '-time_create' ] ) ] добавляют один и тот же функционал (индексирование) только для разных полей?
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
Битый час бьюсь, ничего не выходит, пишет: django.core.exceptions.ImproperlyConfigured: WSGI application 'djangoProjectSB.wsgi.application' could not be loaded; Error importing module. Убрал все изменения связанные с функцией show_post и все равно не работает Как будто что-то сбилось, пробовал даже перегрузит пайчарм.
Комментарий для продвижения канала и выражения благодарности Сергею, за всё, что он для нас делает
Замечательный курс. Очень хорошо, что автор развивает прошлый курс
Очень хороший и интересный курс. Очень хочу научиться пользоваться фреймворком Django. Спасибо Сергею за большую помощь.❤
Я весь сайт делаю на английском и у меня там имена без фамилий, поэтому я сразу сделала person.slug = person.title.
Вообще после просмотра первого курса по Джанго стараюсь ставить видео на паузу и сначала сама стараюсь реализовать нужный функционал, а потом уже смотрю как автор объясняет.
Але спершу потрібно через метод replace() пробіли замінити на '-', інакше слаг буде з пробілом.
In [4]: for w in Women.objects.all():
...: w.slug = str(w.title).replace(' ','-')
...: w.save()
Впервые за курсс появилось использование чего-то такого, чего раньше не объясняли - индексирование полей базы данных. Пришлось гуглить, и всё равно не до конца ещё понятно, мб будет понятно дальше. А так лайк авансом
Спасибо. Очень интересно и понятно.
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__, чтобы обращение к данной библиотеке происходило только в момент создания новой записи.
то чувство, когда отдельный html для постов сделал для тренировки самостоятельно еще на том этапе, когда писали функцию-заглушку show_posts :D
Очень хорошо спасибо огромное!
Хороший курс.
А есть ли возможность сделать так, что бы slug , используя yandex или google translate, автоматически переводил заголовок статьи?
Супер круто! СПАСИБО!!!
Не пойму, почему Women not defined, при запуске цикла в shell_plus
Не благодарите)))
andzhelina-dzholi
margo-robbi
dzhuliya-roberts
ekaterina-guseva
Спасибо!
Кто знает, есть ли разница, если я прописал get_absolute_url вот так:
def get_absolute_url(self):
return reverse('post', args=(self.slug, ))
Так тоже все работает и во вьюху попадает правильный аргумент и все ок.
В django есть специальный SlugField для slug-ов с удобным функционалом
уроки, связанные с жонглированием переменными между файлами, - пока самые сложные
Спасибо большое!!!
Сколько всего будет видео?
80
Чтобы "дважды не вставать" в консоли можно сразу прописать корректные slug выполнив импорт
from pytils.translit import slugify
for w in Women.objects.all():
...: w.slug = slugify(w.title)
...: w.save()
предварительно установить pytils
Спасибо
Так метод slugify можно импортировать из ветки django.template.defaultfilters. Это в 11 уроке было
@@Zavintyshka
У него проблемы с кириллицей
@@TheSuchov Тоже верно, но для url сойдет
@@Zavintyshka только что попробовал вашим предложенным способом. Слаги не сформировались
мне потребовалось 2 часа чтобы понять что всё идет от счетчика р цикла for, который перебирает в posts у views
тем не менее это по-прежнему подробное объяснение логики django, лучше я не видел
А если непосредственно в самом sql колонку добавить вручную, миграцию уже делать не надо? Или как
15:20 - Сергей, объясните пожалуйтса подробнее, почему замена 'posts': data_db на 'posts': posts исправила ошибку с работой ссылок на гравной странице. В чем разница была?
Потому что в словаре коллекции data_db нет метода get_absolute_url.
Можете сказать зачем мы пишем "title":post.title?
На второй title у меня выводится ошибка, та и я сама не понимаю откуда берется.
Наверное в шаблоне post.html (на 4:15) правильнее было бы написать {{ title }}, иначе этот ключ, передаваемый в контексте data не используется
используется в названии закладки
@@selfedu_rus действительно, используется в базовом шаблоне
Классный урок. А могли бы вы на уроке показать как в url подставить категорию. Например, у нас есть категория Актеры, и хотелось бы чтобы все статьи которые прикреплены к данной категории имели url: домен/актеры/название статьи
будет отображение статей по категориям
@@selfedu_rus супер, буду ждать. Ваша подача на 5+!
@@ВторкинСлава У Вас получилось реализовать данный функционал?
👍
Досмотрел урок до конца, все сделал по нему и решил через shell-plus подобавлять еще постов в БД:
Women.objects.create(title='Натали Портман', content='Биография Натали Портман')
Django почему-то без проблем добавила новую запись в БД, хотя в модели указано поле slug = models.SlugField(max_length=255, unique=True, db_index=True)
Почему shell не выдал ошибку, что не заполнено поле slug?
Вроде как, если через shell добавляешь то БД игнорит условия по заполнению полей. Возможно, что это касается только SQlite. Если я правильно понял, то SQlite довольно специфична)
@@devidbrown8176 Хм, странно. Ведь в самой БД, если ее открыть в SQLiteStudio, в схеме таблицы на данном поле указано "NOT NULL". Т.е. проверка должна происходить на уровне самой БД, а не на уровне Джанго.
Сейчас для проверки открыл таблицу в SQLiteStudio, в одной из записей, удалил значение поля, которое должно быть NOT NULL, сохранил, думая, что БД выдаст ошибку, но все успешно сохранилось. Какой-то странный этот SQLite3 - ограничение есть, но оно никак не влияет. ((
Интересно, а slugify будет работать через формы (шаблон)? то есть, не через админку
slugify - это функция в Django (Python) во фронте ее вызвать уже нельзя
Здравствуйте, можно сделать видео с созданием чата на django
Тут уже будет работа с websocket-ом (django channels к примеру), а это объёмная тема. В контексте этих видео-уроков вряд-ли можно уместить такую тему
@@mrduckvc да,но было бы круто если бы него ролик сделал бы
У меня после изменения прямиком в 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 , и да, и нет. Я просто забыл включить Autocommit в Dbeaver. И после изменений в Dbeaver в самом Database, я забыл нажать на Commit. Все что я написал выше, не решает данную проблему) просто нужно было коммитнуть.
интересно еще то, что time_update не меняется при изменении базы данных прямиком с Dbeaver.
Странно, но не работает {% for p in post
после замены на данные из базы.
Всё несколько раз перепроверил. Просто пропускает как не итерируемый объект.
Прошу прощения, нашёл свою ошибку, все ок)
Как в этом цикле делать отступы?
не упомянуто что вместо reverse() лучше использовать её ленивый аналог reverse_lazy()
об этом будет дальше, когда дойдем до классов представлений
6:34 - строки:
slug = models.SlugField(..., db_index = True)
и
class Meta:
indexes = [ models.Indexes ( fields = [ '-time_create' ] ) ]
добавляют один и тот же функционал (индексирование) только для разных полей?
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
Ошибка найдена -- во второй строке после slug зря скобки поставил (невнимательность иногда сильно мешает))
наверное, так:
p.slug = 'slug-'+str(p.pk)
@@selfedu_rus Да, именно так))
(Не сразу увидел ваш ответ, но именно ваш вариант прописания этой строки решил это дело))
Остановился на 10:00, завтра продолжу.
У меня плохие новости. Бегет использует версию MySQL 5.7.21. А в джанго 4.2 уже нет поддержки этой версии, только 8ка…
Что есть "Бегет"?
@@АлексейАлексеев-ц8х9т хостинг провайдер
@@АлексейАлексеев-ц8х9т это хостинг
я установил версию Джанго 4.1
кайф, когда есть собственная вдска
7:23 тут ошибки нет, миграцию создает, но потом при ее применении уже она возникнет
и почему-то еще если убрать blank=True, мигрирует с пустыми строками спокойно, интересно почему
Битый час бьюсь, ничего не выходит, пишет: django.core.exceptions.ImproperlyConfigured: WSGI application 'djangoProjectSB.wsgi.application' could not be loaded; Error importing module. Убрал все изменения связанные с функцией show_post и все равно не работает Как будто что-то сбилось, пробовал даже перегрузит пайчарм.
Нашел в чем дело, почему-то 'django_extensions', было еще прописано в настройках в MIDDLEWARE. А не только в INSTALLED_APP.