#17. Mixins - убираем дублирование кода | Django уроки

  Рет қаралды 47,871

selfedu

selfedu

3 жыл бұрын

Практический курс по Django: stepik.org/a/183363
Django урок 17. Что такое mixins (миксины) и как с их помощью устранить дублирование кода в классах представлений. Рассматривается пример стандартного миксина LoginRequiredMixin и декоратор login_required.
Телеграм-канал: t.me/django_selfedu
Инфо-сайт: proproprogs.ru/django
lesson-17-coolsite.zip: github.com/selfedu-rus/django...
Об авторизации в Django: djbook.ru/rel3.0/topics/auth/...
Русскоязычная документация по Django 3: djbook.ru/rel3.0/
Официальный сайт по Django: www.djangoproject.com

Пікірлер: 154
@PrimaLuceAstronaut
@PrimaLuceAstronaut 2 жыл бұрын
Действительно, один из лучших каналов по питону. Спасибо, Сергей!
@donfedor007
@donfedor007 3 жыл бұрын
Добрый день! Спасибо Вам за урок! Очень интересный!
@denissavast
@denissavast Жыл бұрын
Огромное благодарю за ооотличнейший материал !
@dmitryzagorevskiy507
@dmitryzagorevskiy507 2 жыл бұрын
Очень качественный материал! Супер!
@siarheiulas6969
@siarheiulas6969 Жыл бұрын
Спасибо! Как всегда все подробно и доходчиво!
@friend1cat
@friend1cat 3 жыл бұрын
Спасибо, Сергей!
@xzxEMuJIbxzx
@xzxEMuJIbxzx 2 жыл бұрын
Для вас приготовлено столько мест в раю, сколько видео на этом канале)
@anuarumarov4051
@anuarumarov4051 3 жыл бұрын
Спасибо! очень помогла статья на сайте, как раз то, что искал! Лайк + подписка!
@KravaDota
@KravaDota Жыл бұрын
Спасибо за видео! Как всегда отличное!
@Artur-hn8sg
@Artur-hn8sg 3 жыл бұрын
Преподаватель от бога! Годнота! Спасибо, Сергей.
@user-qn6pq1dk5h
@user-qn6pq1dk5h Жыл бұрын
Помню в курсе по ООП на степике как раз думал где же это применяется) теперь понятнее
@rostislavmalyshev1775
@rostislavmalyshev1775 3 жыл бұрын
Спасибо, Сергей! Как всегда все понятно. С Python 3.9 можно немного упростить: вместо return dict(list(context.items()) + list(c_def.items())) просто return context | c_def
@selfedu_rus
@selfedu_rus 3 жыл бұрын
Круто! Спасибо!
@rostislavmalyshev1775
@rostislavmalyshev1775 3 жыл бұрын
@@selfedu_rus Не за что! У Вас отличный образовательный контент. Многие платные курсы (которые я видел) отстают по полноте и "понятности" подачи материала.
@suhanoves
@suhanoves 3 жыл бұрын
А тем, у кого ещё нет 3.9 тоже можно написать чуть более питоняче {**dict1, **dict2}
@exe88cution
@exe88cution 2 жыл бұрын
@@suhanoves кстати нет. Если в словарях окажутся несколько одинаковых ключей, с одинаковыми значениями - выдаст ошибку. Но если указать так, как автор - ошибки не будет и запишется без дублирования) Я тоже хотел с умничать, но когда проверил - понял, что не совсем так всё глатко)
@suhanoves
@suhanoves 2 жыл бұрын
@@exe88cution какую ошибку у вас выдает интерпретатор? Ключ более позднего словаря перезаписывает более ранний, никакой ошибки не будет, о чем вы?
@LeeNick1976
@LeeNick1976 2 жыл бұрын
Сергей Ты Красавчик !!!
@exe88cution
@exe88cution 2 жыл бұрын
Всё классно, как и всегда впрочем) Единственное, как по мне, более оптимально было бы добавить ещё одну проверку в шаблоне, для показа "добавить статью" только авторизованным)
@KikrAzz
@KikrAzz Жыл бұрын
Шикарно!
@pilina_
@pilina_ Жыл бұрын
Спасибо за видео!
@user-cu1ij7lk1c
@user-cu1ij7lk1c 2 жыл бұрын
Замечательные уроки Уже не первый курс прохожу, большое спасибо! Возможно кто-то сталкивался с проблемой как я Если вы добавили LoginRequiredMixin и у вас при обновлении страницы не вылетала 404 - почистите куки
@13mufasa
@13mufasa Жыл бұрын
От души)
@dneovu
@dneovu Жыл бұрын
или просто выйти из админки)
@alexw2074
@alexw2074 2 жыл бұрын
В urls добавил path('logout/', logout_func, name='logout'), В DataMixin после if not self.request.user.is_authenticated: user_menu.pop(1) добавил: else: user_menu[3] = {'title': "Выйти", 'url_name': 'logout'} В views добавил: def logout_func(request): logout(request) return redirect('home') Хз насколько это правильно, но это работает и я в шоке) Спасибо за уроки :)
@uladzislawchyrets
@uladzislawchyrets 3 жыл бұрын
Хороший урок
@stasdumitrovych228
@stasdumitrovych228 3 жыл бұрын
Доброго времени суток, немного смутило то как вы обновляете словари, а именно строчка кода dict(list(context.items()) + list(c_def.items())). Ваш костыль работает, но правильно написать вот так context.update(c_def).
@selfedu_rus
@selfedu_rus 3 жыл бұрын
Да, согласен, спасибо!
@kirillnetreba
@kirillnetreba 2 жыл бұрын
только важно не писать context.update(c_def) в return, т.к. будет возвращено None. update изменяет словарь inplace и возвращает None. в return тогда надо писать context
@user-sn5nm5rm3v
@user-sn5nm5rm3v Жыл бұрын
Как раз хотел спросить в чем смысл такого объединения словарей через списки кортежей. Прямо голову сломал, пока думал зачем так сделано. И еще не понятно зачем название категории брать через списки постов, когда категория передана через слаг.
@Anonim-im6ln
@Anonim-im6ln 2 жыл бұрын
Круто!) Дякую:)☺️
@RuVl_13
@RuVl_13 3 жыл бұрын
9:09 объединение словарей из 2-х исходных лучше делать с помощью {**x, **y}, а начиная с 3.9 - x | y Да, не по теме, но не зря ж я учил питон))
@selfedu_rus
@selfedu_rus 3 жыл бұрын
Да, спасибо! )
@RuVl_13
@RuVl_13 3 жыл бұрын
@@selfedu_rus Вам спасибо за урок!
@userqh67vey6
@userqh67vey6 Жыл бұрын
return dict(list(context.items())+list(c_def.items())) начиная с пайтон 3.5 можно сократить так: return {***context, *** c_def} (по две звездочки перед каждым словарем, почему-то в коментах вторая звезда обрезается ютубом) Лайк за видео
@user-nm5ld9vr3k
@user-nm5ld9vr3k Жыл бұрын
А начиная с Python 3.9 можно ещё легчe: context | c_def
@Alikhan-xm1xq
@Alikhan-xm1xq Жыл бұрын
@@user-nm5ld9vr3k Спасибо за совет!
@raven_n7413
@raven_n7413 Жыл бұрын
return context.update(c_def) почему-то не работает...хотя вроде должен
@Apologet_2
@Apologet_2 6 ай бұрын
​@@raven_n7413нет, не должен, ты эту строчку кода должен записать в переменную, и потом ее вернуть
@raven_n7413
@raven_n7413 6 ай бұрын
@@Apologet_2 уже не помню, как разрешил данный момент, сейчас изучаю php mysql js
@annapr_tr4799
@annapr_tr4799 Жыл бұрын
spasibo za yrok !!!!
@muhammadislom7207
@muhammadislom7207 3 жыл бұрын
Спасибо.
@zakirovio
@zakirovio Жыл бұрын
интересно, узнал про метод списков copy(). До этого был знаком с модулем copy, у которого были функции deepcopy() и copy()
@gglinof
@gglinof Жыл бұрын
9:07 context.update(self.get_user_context(title='Главная стр'))
@Ananacuk777
@Ananacuk777 Жыл бұрын
по сути на 23 минуте решение проблемы простое def show_categories(sort=None, cat_selected=0): if not sort: cats = Category.objects.annotate(Count('women')) else: cats = Category.objects.annotate(Count('women')).order_by(sort)
@Manu-ei6tn
@Manu-ei6tn Жыл бұрын
Подскажите, пожалуйста. В каких случаях в DJANGO нужно использовать self? Например, когда мы проверяем валидность формы form_valid, то для user=form.save() не используем self. Т.е. НЕ прописываем так self.user = form.save(). Почему так? И вообще, когда создаются запросы от пользователей, то для Класса представления создаются его экземпляры (экземпляры класса) для каждого запроса? Точнее, хотел понять, почему при одновременных запросах, эта переменная user присваивается правильно (т.е. для каждого пользователя (запроса) отдельно)? Так же и с функциями представлениями
@user-zf8hu2bz1j
@user-zf8hu2bz1j Жыл бұрын
Возник вопрос: а зачем мы добавляем в представление класс, который проверяет, авторизован ли пользователь, если мы показываем этот пункт меню только авторизованным пользователям, да и вообще явно делаем эту проверку через user.is_authentificated?
@user-gx6ti9ml4r
@user-gx6ti9ml4r 2 жыл бұрын
а нужно ли оставлять model = Women в WomenHome? Также нашел способ как объединить два словаря: вместо return dict(list(context.items()) + list(c_def.items())) пишем return {**context, **c_def}. Спасибо за видео
@_sergeevich5827
@_sergeevich5827 2 жыл бұрын
Сделал, чтобы после авторизации выводилось имя пользователя вместо Вход.
@envy1892
@envy1892 10 ай бұрын
Решение, для тех у кого при выборе меню "О сайте", появлялось меню "Добавить статью". def about(request): user_menu = menu.copy() if not request.user.is_authenticated: user_menu.pop(1) return render(request, 'teacher/about.html', {'menu': user_menu, 'title': 'О сайте'})
@urrchach
@urrchach 9 ай бұрын
спасибо, твое решение единственное сработало
@urrchach
@urrchach 9 ай бұрын
но для остальных вкладок не работает((
@crazyhowling2203
@crazyhowling2203 3 жыл бұрын
Так мало просмотров на таком контенте хорошем
@ahil7800
@ahil7800 2 жыл бұрын
Все же котиков смотрят. Там думать не надо.
@sainco3036
@sainco3036 3 жыл бұрын
Спасибо. Сергей, где лучше располагать проверки, в шаблонах или на уровне пайтона?
@selfedu_rus
@selfedu_rus 3 жыл бұрын
Смотря какие, если они относятся именно к шаблону и могут быть в будущем изменены, то лучше в шаблоне оставить. Если же относятся к выборке данных и это часть приложения, то, конечно, в приложении. В общем, с позиции здравого смысла это скорее определяется )
@sainco3036
@sainco3036 3 жыл бұрын
@@selfedu_rus понятно, спасибо.
@jamjam3337
@jamjam3337 7 ай бұрын
👏👍
@alexstroidiy9496
@alexstroidiy9496 Жыл бұрын
На 22м 18с была импортирована Count в тихую.......... )))))))
@user-ir4fe7xr7h
@user-ir4fe7xr7h Жыл бұрын
Добрый день, Сергей! Подскажите пожалуйста почему (на 9: 32) вы не выбрали метод update для словарей context. Результат от такого сливания словарей был бы идентичен. Имею в виду: context.update( c_def )
@selfedu_rus
@selfedu_rus Жыл бұрын
Да, вполне можно update, просто там еще старую конструкцию для слияния использовал )
@agrepin3458
@agrepin3458 3 жыл бұрын
Здраствуйте Сергей я хотел би шо ви розобрали модуль socket
@clearsky9174
@clearsky9174 Жыл бұрын
я в прошлом уроке изменил women_set на get_posts и так и оставил, из-за этого выскакивала ошибка в самом конце. Когда вернул все как было, ошибка пропала
@rafskot5793
@rafskot5793 Жыл бұрын
Но получается что на всех страницах, остается выбраная вкладка все новости, как это исправить
@purple_owl
@purple_owl Жыл бұрын
зачем складывать словари, если можно в функцию get_user_context передать контекст
@wrestler91100
@wrestler91100 Жыл бұрын
блок с фильтрацией категорий не работает. Все категории пропали. Попробовал записать так: {% if c.women_set.count > 0 %} отображает только категорию актрисы. По всей видимости проблема была в сортировке объектов в моделях Однако работает код только с таким условием {% if c.women_set.count > 0 %} , условие из видео так и не заработало
@tamerlan5067
@tamerlan5067 Жыл бұрын
в 9:43 вы объединяли context и c_def в один словарь, с помощью context = dict(list(context.items()) + list(context.items())) а нельзя ли было сделать просто: context = {**context, **c_def} ? или так лучше не стоит? Спасибо за ранее ответ, ваши видео просто супер! вы объясняете все в деталях просто и ясно, спасибо огромное за ваш труд
@selfedu_rus
@selfedu_rus Жыл бұрын
ваш вариант лучше, просто я когда делал ориентировался на старые версии Python, где так, вроде, не работало
@dimonk5250
@dimonk5250 2 жыл бұрын
Вопрос про команду на 23 минуте (if c.women > 0 ). Ранее мы этот код перенесли в файл "list_categories.html", как он у вас образовался в base.html?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
уххх... это было год назад, может забыл убрать, может так надо, если очень беспокоит, спросите в сообществе Django в телеграм-канале, там я думаю, все в курсе.
@ahil7800
@ahil7800 2 жыл бұрын
Добрый день. Отличный урок, как всегда. Я только не очень понял почему в файле utils.py в качестве menu мы назначили список. Как потом с этим работать?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Спасибо! Это лишь учебный пример. В реальности да, согласен, это все нужно выносить в БД.
@ahil7800
@ahil7800 2 жыл бұрын
@@selfedu_rus Я имел ввиду, что вместо списка можно было сделать словарь с названием страницы в качестве ключа. Тогда можно было в каждом классе при вызове метода get_user_context указать нужный ключ, и получить словарь контекста по этому ключу. Не знаю делают ли так на практике. Я сам только учусь. Но мне кажется так было бы удобнее чем выбирать из списка по индексу.
@LeeNick1976
@LeeNick1976 2 жыл бұрын
Спасибо. Равных по джагно обучению нет !!!
@zakchips
@zakchips 3 жыл бұрын
спасибо.попробовала поэкспериментировать с "глобальными" переменными, доступными в любой template. Пришла к выводу, что лучше в таком случае или template tags or contex_processors. не знаю ещё,как это отражается на скорости, но может просто забыть прописать в каком-нибудь классе миксин и долго бороться с необнаруженной переменной и её значением.
@selfedu_rus
@selfedu_rus 3 жыл бұрын
В Mixins можно прописать дефолтное значение переменной и не должно тогда быть проблем.
@silverus_morgan
@silverus_morgan Жыл бұрын
почему ссылка на русскоязычную документацию не работает ?((
@urrchach
@urrchach 9 ай бұрын
Мда, делать "домашнее задание", чтобы сейчас некоторые функции у меня не работали, класс👍🏻
@gkenjutsu
@gkenjutsu 2 жыл бұрын
Почему у меня после импорта и добавления в класс AddPage у меня не проверяется авторизован ли пользователь и не выводится Page not found 404, а выводится страница добавления статьи?
@gkenjutsu
@gkenjutsu 2 жыл бұрын
Понял в чём была причина, оказывается нужно выйти с аккаунта root в админ панели!
@user-lm9oe9wr6n
@user-lm9oe9wr6n 11 ай бұрын
Нужно выйти из админки
@venator820
@venator820 3 жыл бұрын
Большое спасибо отличные видео только подскажите на 8:25 почему метод родителя вызывается через self а не через super() то есть get_context_data и get_user_context это оба метода родителей почему они вызываются по разному? Спасибо!
@RuVl_13
@RuVl_13 3 жыл бұрын
super() - это __init__ метод родительского класса
@user-rl7dv8qn7z
@user-rl7dv8qn7z 2 жыл бұрын
такой же вопрос
@veaceslavlefter
@veaceslavlefter Жыл бұрын
Оба метода можно вызвать через super(), это гарантирует что они будут вызваны из родительских классов. А если вызывать через self.method_name() то поиск метода идет сначала внутри класса, потом в родительских.
@brianryan4053
@brianryan4053 2 жыл бұрын
Скажите пожалуйста а какая разница между миксином и интерфейсом? Я так понял что то что называется интерфейсом в других языках называется миксином в Джанго
@selfedu_rus
@selfedu_rus 2 жыл бұрын
это разные вещи, интерфейсы лишь определяют публичные методы для взаимодействия с классами, а миксины наполняют классы конкретным функционалом
@brianryan4053
@brianryan4053 2 жыл бұрын
@@selfedu_rus Спасибо за ответ буду разбираться, в Питоне класс может наследовать много классов, поэтому нет интерфейсов, так я подумал что это что-то типа того, ну буду дальше учиться, всё остальное очень легко усваивается без напряжения
@neuroofun4627
@neuroofun4627 Жыл бұрын
Тем кто заморачивался по счет главного меню отдельным тегом: @register.inclusion_tag('women/main_menu.html', takes_context=True) def show_main_menu(context): request = context['request'] user_menu = menu.copy() if not request.user.is_authenticated: user_menu.pop(1) return {'menu': user_menu}
@urrchach
@urrchach 9 ай бұрын
нет, к сожалению не работает, даже при чистке куки
@LukasFeinberg
@LukasFeinberg Жыл бұрын
20:46 И если вы делали это через пользовательские теги, как давал задачку автор, то ничего не случится :) Сначала нужно вернуть вывод верхнего меню как обычно.
@SITARNET
@SITARNET Жыл бұрын
Может кто подскажет как это сделать? Я выводил меню через пользовательский тег!
@Tailiira
@Tailiira 9 ай бұрын
@@SITARNET уже поди не актуально, но мало-ли кто ещё тут когда будет искать - я так сделал: @register.inclusion_tag('mobs/list_menu.html', takes_context=True) def show_menu(context): request = context['request'] user_menu = [] menu = Menu.objects.all() for i in menu: user_menu.append(i) if not request.user.is_authenticated: user_menu.pop(2) return {'menu': user_menu}
@urrchach
@urrchach 9 ай бұрын
​​@@Tailiiraпривет, у меня Menu подчеркнуто красным, хотя оно есть в файле с тегами, почему так?(
@Architect_Mobile
@Architect_Mobile 2 жыл бұрын
Мне кажется архитектурно так решать проблему не верно , наследование - это когда на основе одного объекта создаешь другой , а не просто переопределяешь какие-то функции. Ведь не все совпадение кода является дублированием , такие задачи на мой взгляд решаются внедрением зависимостей, а не наследованием
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Решений одной и той же задачи может быть множество.
@brianryan4053
@brianryan4053 2 жыл бұрын
Судя по комменту вы пришли из ДжаваСкрипт. Наследование в ДжаваСкрипт - это совсем не то что наследование в других языках.
@brianryan4053
@brianryan4053 2 жыл бұрын
Только в ДжаваСкрипт наследование связано с объектами, во всех остальных языках наследование связано с классами
@Architect_Mobile
@Architect_Mobile 2 жыл бұрын
@@brianryan4053 ххахахах)) Класс - это описание объекта))) По сути это одно и тоже))) Класс описывает из чего состоит объект))
@AlexandrSpirit
@AlexandrSpirit Жыл бұрын
Непонятно, чем от обычного наследования отличается?
@selfedu_rus
@selfedu_rus Жыл бұрын
ничем, паттерн Mixins - это прием расширения функциональности за счет добавления/удаления базовых классов
@rafskot5793
@rafskot5793 Жыл бұрын
user_menu = menu.copy() if not self.request.user.is_authenticated: user_menu.pop(7) Не убирает нужный элемент, кто нибудь разобрался?
@AltairAnuarbek
@AltairAnuarbek Ай бұрын
Здравствуйте не могу открыть ваш сайт, ваш что хакнули?
@selfedu_rus
@selfedu_rus Ай бұрын
у меня все работает
@user-zl3xz2pf9w
@user-zl3xz2pf9w 2 жыл бұрын
Те кто сделал домашнее задание по вынесению меню из шаблона Base верните кусок кода обратно в base
@user-mi6zn5mt4c
@user-mi6zn5mt4c Жыл бұрын
а можно убрать пустые категории так: Category.objects.annotate(total=Count('product')).filter(total__gt=0) по предыдущему уроку делал
@helish_88
@helish_88 3 жыл бұрын
а как сделать тоже самое для админки? ограничить админку по ИП к примеру? не смог найти хороших примеров
@crazyhowling2203
@crazyhowling2203 3 жыл бұрын
Не нашел случайно? Мне бы тоже ограничить админку не помешало
@helish_88
@helish_88 3 жыл бұрын
@@crazyhowling2203 поменяй название, типа не /admin а /my_admin
@crazyhowling2203
@crazyhowling2203 3 жыл бұрын
@@helish_88 Спасибо, уже не надо) Я сделал :)
@helish_88
@helish_88 3 жыл бұрын
@@crazyhowling2203 а как сделал?
@dimonk5250
@dimonk5250 2 жыл бұрын
Здравствуйте. Не могу понять почему при добавление команды {% if c.blog > 0 %} (23 минута) у меня пропадает меню. Все категории слева. И еще одно предложение, создать видео, про то, как отслеживать ошибки, при которых сайт загружается, в консоли нет ошибок, но нужный функционал не работает, например как при ошибке сверху.
@gladgalakas5929
@gladgalakas5929 2 жыл бұрын
та же проблема
@gladgalakas5929
@gladgalakas5929 2 жыл бұрын
не разобрался?
@lordir2
@lordir2 2 жыл бұрын
@@gladgalakas5929 попробуй у модели отключить сортировку, в прошлом видео про это говорилось
@RoTor_Ex
@RoTor_Ex 2 жыл бұрын
@@lordir2 Спасибо, помогло)
@JASKETfromCV
@JASKETfromCV 2 жыл бұрын
у меня так же не получалось. сделал через {% if c.news_set.count > 0 %} и заработало
@yreeinord3573
@yreeinord3573 2 жыл бұрын
def get_context_data(self, *, object_list=None, **kwargs): context = super().get_context_data(**kwargs) c = Category.objects.get(slug=self.kwargs['cat_slug']) c_def = self.get_user_context(title='Категория - ' + str(c.name), cat_selected=c.pk) return dict(list(context.items()) + list(c_def.items())) С этим кодом у меня в шаблон не выводится d if,kjyt base.html как поправить что бы выводился
@f-s_interpreter
@f-s_interpreter Жыл бұрын
Подскажите пж c-def это придуманнае название или встроенное?
@selfedu_rus
@selfedu_rus Жыл бұрын
def - это встроенное
@f-s_interpreter
@f-s_interpreter Жыл бұрын
@@selfedu_rus я не про деф. Вы когда создавали второй context назвали его c_def
@selfedu_rus
@selfedu_rus Жыл бұрын
@@f-s_interpreter а, это обычная переменная, не более того, можете ее назвать сами как хотите ))
@f-s_interpreter
@f-s_interpreter Жыл бұрын
@@selfedu_rusспасибо вам огромное. Ещё хотел бы предложить идею сделать, если есть свободное время, просто пустой проект и как выложить на бесплатные сайты ( Render. Com, Railway. App и Cyclic). На английском просторе говорят это замена хероку
@ShadowStormlq5mwdasd
@ShadowStormlq5mwdasd 2 жыл бұрын
А разве не нужно обращаться к базовым классам на прямую при множественном наследование - это же рациональниее чем пологаться на порядок записанных классов, вы наверное скажете - а вдруг поменяется название класса, а я скажу а вдруг поменяется порядок записанных классов? и я так понимаю при context = super().get_context_data(**kwargs) оно сначало ищет в DataMixin а потом в классах вьюх, а не быстрее ли будет ListView.get_context_data(self, **kwargs)?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
при множественном наследовании стараются базовые классы делать с инициализатором без параметров, тогда порядок их следования не имеет большого значения, ну и при разработке классов, конечно же учитывать, что порядок может измениться
@NoName-sd8xg
@NoName-sd8xg Жыл бұрын
Очень интересно, но ничего не понятно
@dmitriygribkov1272
@dmitriygribkov1272 2 жыл бұрын
Здравствуйте,объясните,пожалуйста в base.html мы вставили c.women__count > 0: Аннотация добавила поле каунт,тут разобрался)а почему обращение к women(откуда эта переменная) в таком виде: с __ (два нижних подчеркивания)?
@user-rm3ed8tr7z
@user-rm3ed8tr7z Жыл бұрын
А как сделать так, чтобы если пользователь не авторизован он вообще не видел кнопку "Добавить статью"?
@showrun4747
@showrun4747 Жыл бұрын
пересмотрите ещё раз, только внимательнее ))
@MobileLegendsImmortal
@MobileLegendsImmortal Жыл бұрын
Не могу решить ошибку по выведению рубрик по которым есть статьи: cats = Category.annotate(Count('women')) у меня Count светиться красным и потом ошибка в браузере. Может что-то нужно было импортировать для работы?
@MobileLegendsImmortal
@MobileLegendsImmortal Жыл бұрын
Обнаружил, что не импортировал метод, вдруг кому на заметку.
@KonstantinKazancev
@KonstantinKazancev Жыл бұрын
У меня тоже самое! Не пойму что нужно импортировать? Тоже, что и в видео не импортируется, возможно из-за того, что другие версии. Подскажите, как вы решили эту проблему?
@MobileLegendsImmortal
@MobileLegendsImmortal Жыл бұрын
@@KonstantinKazancev я уже и забыл о чем речь и туго помню так как отвлёкся от Джанго, на сколько я помню, я решил просто отказаться от способа миксте и без него все делал. А ещё мало кто рассказывает что в сам начале когда создаёте модели, то магическим метолом нужно __str__ и дальше указываем там self. Title то нужно указать испорт всех полей, иначе в доступе в путях будет передаваться только тот самый Тайтл и больше других данных не вызвать… а на счёт кстати этой проблемы я вроде бы ее решил непосредственно в view . Потом загляну , скину код
@KonstantinKazancev
@KonstantinKazancev Жыл бұрын
@@MobileLegendsImmortal Спасибо, что ответили мне!) Я нашел решение проблемы!)
@MobileLegendsImmortal
@MobileLegendsImmortal Жыл бұрын
​@@KonstantinKazancev создал отельный файл _tags @register.simple_tag(name='get_cats') # превращаем функцию в тег при помози декоратора def get_categories(): cats = Category.objects.annotate(Count('women')) return cats дальше во вьюшке обратился через одну модель к другой так вот def get_queryset(self): return Women.objects.filter(cat__slug=self.kwargs['cat_slug'], is_published=True) path('category//', cache_page(60)(views.show_category.as_view()), name='category'), path('post//', cache_page(60)(views.show_post.as_view()), name='post'),
@ShadowStormlq5mwdasd
@ShadowStormlq5mwdasd 2 жыл бұрын
И кста откуда DataMixin взял self.request? Это же не может быть из дочернего класса - то есть это как-то свзяано с классом вьюхи при вызове в дочернем?
@citricmint_forstudy4608
@citricmint_forstudy4608 Жыл бұрын
возник такой же вопрос, скажите пожалуйста, вы разобрались?
@bocik2854
@bocik2854 Жыл бұрын
Да
@a_gassi
@a_gassi Жыл бұрын
А не проще меню и сайд-бар с категориями просто внести в базовый шаблон?
@user-ex9zk3bs4i
@user-ex9zk3bs4i 2 жыл бұрын
Здравствуйте объясните п
@nikitayasnev
@nikitayasnev Жыл бұрын
очень непонятно
@python4.0
@python4.0 Жыл бұрын
cats = Category.objects.filter(women__is_published=True).annotate(women__count=Count('women')) у меня только с таким вариантом заработало, может кому-то понадобится)
@InstituteOfIndependence
@InstituteOfIndependence Жыл бұрын
Может кто-нибудь знает как сделать редирект к админке используя имя маршрута? Я получаю ошибку: Reverse for 'admin' not found. 'admin' is not a valid view function or pattern name. Файл coolsite.urls: urlpatterns = [ path('admin/', admin.site.urls, name='admin'), path('', include('women.urls')), ] Файл women.views: login_url = reverse_lazy('admin')
@nazi424
@nazi424 5 ай бұрын
from lastnews.views import pageNotFound, serverError, accessblocked, requestError File "E:\python\URN\lastnews\views.py", line 6, in from URN.lastnews.util import DataMixin ModuleNotFoundError: No module named 'URN.lastnews'
@user-zw3om5vi8h
@user-zw3om5vi8h 3 жыл бұрын
Спасибо, Сергей!
#16. Основы ORM Django за час | Django уроки
1:03:59
small vs big hoop #tiktok
00:12
Анастасия Тарасова
Рет қаралды 25 МЛН
Alat Seru Penolong untuk Mimpi Indah Bayi!
00:31
Let's GLOW! Indonesian
Рет қаралды 11 МЛН
Универ. 13 лет спустя - ВСЕ СЕРИИ ПОДРЯД
9:07:11
Комедии 2023
Рет қаралды 6 МЛН
Mixins in Python
6:11
Python for Everyone
Рет қаралды 20 М.
разбор классов django rest framework GenericAPIView ListAPIView RetrieveAPIView
34:12
Django School | Омельченко Михаил
Рет қаралды 9 М.
MIXINS in Python explained with an example
4:26
Python for Everyone
Рет қаралды 4,3 М.
Всё об исключениях и работе с ними в Python
30:34
Диджитализируй!
Рет қаралды 49 М.
разбор классов django View | ListView | DetailView
1:09:01
Django School | Омельченко Михаил
Рет қаралды 16 М.