Действительно, один из лучших каналов по питону. Спасибо, Сергей!
@xzxEMuJIbxzx2 жыл бұрын
Для вас приготовлено столько мест в раю, сколько видео на этом канале)
@АлександрГильмияров2 жыл бұрын
Замечательные уроки Уже не первый курс прохожу, большое спасибо! Возможно кто-то сталкивался с проблемой как я Если вы добавили LoginRequiredMixin и у вас при обновлении страницы не вылетала 404 - почистите куки
@13mufasa2 жыл бұрын
От души)
@dneovu Жыл бұрын
или просто выйти из админки)
@alexw20743 жыл бұрын
В 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') Хз насколько это правильно, но это работает и я в шоке) Спасибо за уроки :)
@friend1cat3 жыл бұрын
Спасибо, Сергей!
@rostislavmalyshev17753 жыл бұрын
Спасибо, Сергей! Как всегда все понятно. С Python 3.9 можно немного упростить: вместо return dict(list(context.items()) + list(c_def.items())) просто return context | c_def
@selfedu_rus3 жыл бұрын
Круто! Спасибо!
@rostislavmalyshev17753 жыл бұрын
@@selfedu_rus Не за что! У Вас отличный образовательный контент. Многие платные курсы (которые я видел) отстают по полноте и "понятности" подачи материала.
@suhanoves3 жыл бұрын
А тем, у кого ещё нет 3.9 тоже можно написать чуть более питоняче {**dict1, **dict2}
@exe88cution3 жыл бұрын
@@suhanoves кстати нет. Если в словарях окажутся несколько одинаковых ключей, с одинаковыми значениями - выдаст ошибку. Но если указать так, как автор - ошибки не будет и запишется без дублирования) Я тоже хотел с умничать, но когда проверил - понял, что не совсем так всё глатко)
@suhanoves3 жыл бұрын
@@exe88cution какую ошибку у вас выдает интерпретатор? Ключ более позднего словаря перезаписывает более ранний, никакой ошибки не будет, о чем вы?
@RuVl_133 жыл бұрын
9:09 объединение словарей из 2-х исходных лучше делать с помощью {**x, **y}, а начиная с 3.9 - x | y Да, не по теме, но не зря ж я учил питон))
@selfedu_rus3 жыл бұрын
Да, спасибо! )
@RuVl_133 жыл бұрын
@@selfedu_rus Вам спасибо за урок!
@stasdumitrovych2283 жыл бұрын
Доброго времени суток, немного смутило то как вы обновляете словари, а именно строчка кода dict(list(context.items()) + list(c_def.items())). Ваш костыль работает, но правильно написать вот так context.update(c_def).
@selfedu_rus3 жыл бұрын
Да, согласен, спасибо!
@kirillnetreba2 жыл бұрын
только важно не писать context.update(c_def) в return, т.к. будет возвращено None. update изменяет словарь inplace и возвращает None. в return тогда надо писать context
@ОлегШенкер-з8ш Жыл бұрын
Как раз хотел спросить в чем смысл такого объединения словарей через списки кортежей. Прямо голову сломал, пока думал зачем так сделано. И еще не понятно зачем название категории брать через списки постов, когда категория передана через слаг.
@userqh67vey62 жыл бұрын
return dict(list(context.items())+list(c_def.items())) начиная с пайтон 3.5 можно сократить так: return {***context, *** c_def} (по две звездочки перед каждым словарем, почему-то в коментах вторая звезда обрезается ютубом) Лайк за видео
@MaksimShymanouski2 жыл бұрын
А начиная с Python 3.9 можно ещё легчe: context | c_def
@Alikhan-xm1xq2 жыл бұрын
@@MaksimShymanouski Спасибо за совет!
@raven_n7413 Жыл бұрын
return context.update(c_def) почему-то не работает...хотя вроде должен
@Apologet_2 Жыл бұрын
@@raven_n7413нет, не должен, ты эту строчку кода должен записать в переменную, и потом ее вернуть
@raven_n7413 Жыл бұрын
@@Apologet_2 уже не помню, как разрешил данный момент, сейчас изучаю php mysql js
@denissavast2 жыл бұрын
Огромное благодарю за ооотличнейший материал !
@dmitryzagorevskiy5073 жыл бұрын
Очень качественный материал! Супер!
@siarheiulas6969 Жыл бұрын
Спасибо! Как всегда все подробно и доходчиво!
@ArturLuckyMan3 жыл бұрын
Преподаватель от бога! Годнота! Спасибо, Сергей.
@Максим-т5ш8и2 жыл бұрын
Помню в курсе по ООП на степике как раз думал где же это применяется) теперь понятнее
@KravaDota Жыл бұрын
Спасибо за видео! Как всегда отличное!
@anuarumarov40513 жыл бұрын
Спасибо! очень помогла статья на сайте, как раз то, что искал! Лайк + подписка!
@donfedor0073 жыл бұрын
Добрый день! Спасибо Вам за урок! Очень интересный!
@KikrAzz2 жыл бұрын
Шикарно!
@exe88cution3 жыл бұрын
Всё классно, как и всегда впрочем) Единственное, как по мне, более оптимально было бы добавить ещё одну проверку в шаблоне, для показа "добавить статью" только авторизованным)
Возник вопрос: а зачем мы добавляем в представление класс, который проверяет, авторизован ли пользователь, если мы показываем этот пункт меню только авторизованным пользователям, да и вообще явно делаем эту проверку через user.is_authentificated?
@Ananacuk7772 жыл бұрын
по сути на 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)
@zakirovio Жыл бұрын
интересно, узнал про метод списков copy(). До этого был знаком с модулем copy, у которого были функции deepcopy() и copy()
@Manu-ei6tn Жыл бұрын
Подскажите, пожалуйста. В каких случаях в DJANGO нужно использовать self? Например, когда мы проверяем валидность формы form_valid, то для user=form.save() не используем self. Т.е. НЕ прописываем так self.user = form.save(). Почему так? И вообще, когда создаются запросы от пользователей, то для Класса представления создаются его экземпляры (экземпляры класса) для каждого запроса? Точнее, хотел понять, почему при одновременных запросах, эта переменная user присваивается правильно (т.е. для каждого пользователя (запроса) отдельно)? Так же и с функциями представлениями
@rafskot5793 Жыл бұрын
Но получается что на всех страницах, остается выбраная вкладка все новости, как это исправить
@crazyhowling22033 жыл бұрын
Так мало просмотров на таком контенте хорошем
@ahil78003 жыл бұрын
Все же котиков смотрят. Там думать не надо.
@wrestler91100 Жыл бұрын
блок с фильтрацией категорий не работает. Все категории пропали. Попробовал записать так: {% if c.women_set.count > 0 %} отображает только категорию актрисы. По всей видимости проблема была в сортировке объектов в моделях Однако работает код только с таким условием {% if c.women_set.count > 0 %} , условие из видео так и не заработало
@alexstroidiy9496 Жыл бұрын
На 22м 18с была импортирована Count в тихую.......... )))))))
@pilina_2 жыл бұрын
Спасибо за видео!
@АзамПополам2 жыл бұрын
а нужно ли оставлять model = Women в WomenHome? Также нашел способ как объединить два словаря: вместо return dict(list(context.items()) + list(c_def.items())) пишем return {**context, **c_def}. Спасибо за видео
@envy1892 Жыл бұрын
Решение, для тех у кого при выборе меню "О сайте", появлялось меню "Добавить статью". 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 Жыл бұрын
но для остальных вкладок не работает((
@tamerlan5067 Жыл бұрын
в 9:43 вы объединяли context и c_def в один словарь, с помощью context = dict(list(context.items()) + list(context.items())) а нельзя ли было сделать просто: context = {**context, **c_def} ? или так лучше не стоит? Спасибо за ранее ответ, ваши видео просто супер! вы объясняете все в деталях просто и ясно, спасибо огромное за ваш труд
@selfedu_rus Жыл бұрын
ваш вариант лучше, просто я когда делал ориентировался на старые версии Python, где так, вроде, не работало
@clearsky9174 Жыл бұрын
я в прошлом уроке изменил women_set на get_posts и так и оставил, из-за этого выскакивала ошибка в самом конце. Когда вернул все как было, ошибка пропала
@gkenjutsu3 жыл бұрын
Почему у меня после импорта и добавления в класс AddPage у меня не проверяется авторизован ли пользователь и не выводится Page not found 404, а выводится страница добавления статьи?
@gkenjutsu3 жыл бұрын
Понял в чём была причина, оказывается нужно выйти с аккаунта root в админ панели!
@DaryaSinitsyna-j2u Жыл бұрын
Нужно выйти из админки
@purple_owl Жыл бұрын
зачем складывать словари, если можно в функцию get_user_context передать контекст
@silverus_morgan Жыл бұрын
почему ссылка на русскоязычную документацию не работает ?((
@sainco30363 жыл бұрын
Спасибо. Сергей, где лучше располагать проверки, в шаблонах или на уровне пайтона?
@selfedu_rus3 жыл бұрын
Смотря какие, если они относятся именно к шаблону и могут быть в будущем изменены, то лучше в шаблоне оставить. Если же относятся к выборке данных и это часть приложения, то, конечно, в приложении. В общем, с позиции здравого смысла это скорее определяется )
@sainco30363 жыл бұрын
@@selfedu_rus понятно, спасибо.
@agrepin34583 жыл бұрын
Здраствуйте Сергей я хотел би шо ви розобрали модуль socket
@dimonk52502 жыл бұрын
Вопрос про команду на 23 минуте (if c.women > 0 ). Ранее мы этот код перенесли в файл "list_categories.html", как он у вас образовался в base.html?
@selfedu_rus2 жыл бұрын
уххх... это было год назад, может забыл убрать, может так надо, если очень беспокоит, спросите в сообществе Django в телеграм-канале, там я думаю, все в курсе.
@AltairAnuarbek7 ай бұрын
Здравствуйте не могу открыть ваш сайт, ваш что хакнули?
@selfedu_rus7 ай бұрын
у меня все работает
@Anonim-im6ln2 жыл бұрын
Круто!) Дякую:)☺️
@brianryan40532 жыл бұрын
Скажите пожалуйста а какая разница между миксином и интерфейсом? Я так понял что то что называется интерфейсом в других языках называется миксином в Джанго
@selfedu_rus2 жыл бұрын
это разные вещи, интерфейсы лишь определяют публичные методы для взаимодействия с классами, а миксины наполняют классы конкретным функционалом
@brianryan40532 жыл бұрын
@@selfedu_rus Спасибо за ответ буду разбираться, в Питоне класс может наследовать много классов, поэтому нет интерфейсов, так я подумал что это что-то типа того, ну буду дальше учиться, всё остальное очень легко усваивается без напряжения
@БорисБондаренко-ы1л Жыл бұрын
Добрый день, Сергей! Подскажите пожалуйста почему (на 9: 32) вы не выбрали метод update для словарей context. Результат от такого сливания словарей был бы идентичен. Имею в виду: context.update( c_def )
@selfedu_rus Жыл бұрын
Да, вполне можно update, просто там еще старую конструкцию для слияния использовал )
@dimonk52502 жыл бұрын
Здравствуйте. Не могу понять почему при добавление команды {% if c.blog > 0 %} (23 минута) у меня пропадает меню. Все категории слева. И еще одно предложение, создать видео, про то, как отслеживать ошибки, при которых сайт загружается, в консоли нет ошибок, но нужный функционал не работает, например как при ошибке сверху.
@gladgalakas59292 жыл бұрын
та же проблема
@gladgalakas59292 жыл бұрын
не разобрался?
@lordir22 жыл бұрын
@@gladgalakas5929 попробуй у модели отключить сортировку, в прошлом видео про это говорилось
@RoTor_Ex2 жыл бұрын
@@lordir2 Спасибо, помогло)
@JASKETfromCV2 жыл бұрын
у меня так же не получалось. сделал через {% if c.news_set.count > 0 %} и заработало
@_sergeevich58272 жыл бұрын
Сделал, чтобы после авторизации выводилось имя пользователя вместо Вход.
@urrchach Жыл бұрын
Мда, делать "домашнее задание", чтобы сейчас некоторые функции у меня не работали, класс👍🏻
@dmitriygribkov12722 жыл бұрын
Здравствуйте,объясните,пожалуйста в base.html мы вставили c.women__count > 0: Аннотация добавила поле каунт,тут разобрался)а почему обращение к women(откуда эта переменная) в таком виде: с __ (два нижних подчеркивания)?
@AlexandrSpirit2 жыл бұрын
Непонятно, чем от обычного наследования отличается?
@selfedu_rus2 жыл бұрын
ничем, паттерн Mixins - это прием расширения функциональности за счет добавления/удаления базовых классов
@ahil78003 жыл бұрын
Добрый день. Отличный урок, как всегда. Я только не очень понял почему в файле utils.py в качестве menu мы назначили список. Как потом с этим работать?
@selfedu_rus3 жыл бұрын
Спасибо! Это лишь учебный пример. В реальности да, согласен, это все нужно выносить в БД.
@ahil78003 жыл бұрын
@@selfedu_rus Я имел ввиду, что вместо списка можно было сделать словарь с названием страницы в качестве ключа. Тогда можно было в каждом классе при вызове метода get_user_context указать нужный ключ, и получить словарь контекста по этому ключу. Не знаю делают ли так на практике. Я сам только учусь. Но мне кажется так было бы удобнее чем выбирать из списка по индексу.
@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 Жыл бұрын
нет, к сожалению не работает, даже при чистке куки
@venator8203 жыл бұрын
Большое спасибо отличные видео только подскажите на 8:25 почему метод родителя вызывается через self а не через super() то есть get_context_data и get_user_context это оба метода родителей почему они вызываются по разному? Спасибо!
@RuVl_133 жыл бұрын
super() - это __init__ метод родительского класса
@КостяГорохов-б6с2 жыл бұрын
такой же вопрос
@veaceslavlefter Жыл бұрын
Оба метода можно вызвать через super(), это гарантирует что они будут вызваны из родительских классов. А если вызывать через self.method_name() то поиск метода идет сначала внутри класса, потом в родительских.
@Architect_Mobile2 жыл бұрын
Мне кажется архитектурно так решать проблему не верно , наследование - это когда на основе одного объекта создаешь другой , а не просто переопределяешь какие-то функции. Ведь не все совпадение кода является дублированием , такие задачи на мой взгляд решаются внедрением зависимостей, а не наследованием
@selfedu_rus2 жыл бұрын
Решений одной и той же задачи может быть множество.
@brianryan40532 жыл бұрын
Судя по комменту вы пришли из ДжаваСкрипт. Наследование в ДжаваСкрипт - это совсем не то что наследование в других языках.
@brianryan40532 жыл бұрын
Только в ДжаваСкрипт наследование связано с объектами, во всех остальных языках наследование связано с классами
@Architect_Mobile2 жыл бұрын
@@brianryan4053 ххахахах)) Класс - это описание объекта))) По сути это одно и тоже))) Класс описывает из чего состоит объект))
@rafskot5793 Жыл бұрын
user_menu = menu.copy() if not self.request.user.is_authenticated: user_menu.pop(7) Не убирает нужный элемент, кто нибудь разобрался?
@helish_883 жыл бұрын
а как сделать тоже самое для админки? ограничить админку по ИП к примеру? не смог найти хороших примеров
@crazyhowling22033 жыл бұрын
Не нашел случайно? Мне бы тоже ограничить админку не помешало
@helish_883 жыл бұрын
@@crazyhowling2203 поменяй название, типа не /admin а /my_admin
@crazyhowling22033 жыл бұрын
@@helish_88 Спасибо, уже не надо) Я сделал :)
@helish_883 жыл бұрын
@@crazyhowling2203 а как сделал?
@MobileLegendsImmortal Жыл бұрын
Не могу решить ошибку по выведению рубрик по которым есть статьи: cats = Category.annotate(Count('women')) у меня Count светиться красным и потом ошибка в браузере. Может что-то нужно было импортировать для работы?
@MobileLegendsImmortal Жыл бұрын
Обнаружил, что не импортировал метод, вдруг кому на заметку.
@KonstantinKazancev Жыл бұрын
У меня тоже самое! Не пойму что нужно импортировать? Тоже, что и в видео не импортируется, возможно из-за того, что другие версии. Подскажите, как вы решили эту проблему?
@MobileLegendsImmortal Жыл бұрын
@@KonstantinKazancev я уже и забыл о чем речь и туго помню так как отвлёкся от Джанго, на сколько я помню, я решил просто отказаться от способа миксте и без него все делал. А ещё мало кто рассказывает что в сам начале когда создаёте модели, то магическим метолом нужно __str__ и дальше указываем там self. Title то нужно указать испорт всех полей, иначе в доступе в путях будет передаваться только тот самый Тайтл и больше других данных не вызвать… а на счёт кстати этой проблемы я вроде бы ее решил непосредственно в view . Потом загляну , скину код
@KonstantinKazancev Жыл бұрын
@@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'),
@yreeinord35733 жыл бұрын
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 как поправить что бы выводился
@ShadowStormlq5mwdasd2 жыл бұрын
А разве не нужно обращаться к базовым классам на прямую при множественном наследование - это же рациональниее чем пологаться на порядок записанных классов, вы наверное скажете - а вдруг поменяется название класса, а я скажу а вдруг поменяется порядок записанных классов? и я так понимаю при context = super().get_context_data(**kwargs) оно сначало ищет в DataMixin а потом в классах вьюх, а не быстрее ли будет ListView.get_context_data(self, **kwargs)?
@selfedu_rus2 жыл бұрын
при множественном наследовании стараются базовые классы делать с инициализатором без параметров, тогда порядок их следования не имеет большого значения, ну и при разработке классов, конечно же учитывать, что порядок может измениться
@f-s_interpreter2 жыл бұрын
Подскажите пж c-def это придуманнае название или встроенное?
@selfedu_rus2 жыл бұрын
def - это встроенное
@f-s_interpreter2 жыл бұрын
@@selfedu_rus я не про деф. Вы когда создавали второй context назвали его c_def
@selfedu_rus2 жыл бұрын
@@f-s_interpreter а, это обычная переменная, не более того, можете ее назвать сами как хотите ))
@f-s_interpreter2 жыл бұрын
@@selfedu_rusспасибо вам огромное. Ещё хотел бы предложить идею сделать, если есть свободное время, просто пустой проект и как выложить на бесплатные сайты ( Render. Com, Railway. App и Cyclic). На английском просторе говорят это замена хероку
@ВладимирРодионов-з2т2 жыл бұрын
А как сделать так, чтобы если пользователь не авторизован он вообще не видел кнопку "Добавить статью"?
@showrun4747 Жыл бұрын
пересмотрите ещё раз, только внимательнее ))
@РинатХайретдинов-н3ц Жыл бұрын
а можно убрать пустые категории так: Category.objects.annotate(total=Count('product')).filter(total__gt=0) по предыдущему уроку делал
@jamjam3337 Жыл бұрын
👏👍
@АндрейАндреев-г4ц2 жыл бұрын
Те кто сделал домашнее задание по вынесению меню из шаблона Base верните кусок кода обратно в base
@LeeNick19762 жыл бұрын
Спасибо. Равных по джагно обучению нет !!!
@ShadowStormlq5mwdasd2 жыл бұрын
И кста откуда DataMixin взял self.request? Это же не может быть из дочернего класса - то есть это как-то свзяано с классом вьюхи при вызове в дочернем?
@citricmint_forstudy46082 жыл бұрын
возник такой же вопрос, скажите пожалуйста, вы разобрались?
@bocik28542 жыл бұрын
Да
@a_gassi Жыл бұрын
А не проще меню и сайд-бар с категориями просто внести в базовый шаблон?
@NoName-sd8xg2 жыл бұрын
Очень интересно, но ничего не понятно
@АртемТит-в5ь2 жыл бұрын
Здравствуйте объясните п
@zakchips3 жыл бұрын
спасибо.попробовала поэкспериментировать с "глобальными" переменными, доступными в любой template. Пришла к выводу, что лучше в таком случае или template tags or contex_processors. не знаю ещё,как это отражается на скорости, но может просто забыть прописать в каком-нибудь классе миксин и долго бороться с необнаруженной переменной и её значением.
@selfedu_rus3 жыл бұрын
В Mixins можно прописать дефолтное значение переменной и не должно тогда быть проблем.
@nikitayasnev Жыл бұрын
очень непонятно
@python4.0 Жыл бұрын
cats = Category.objects.filter(women__is_published=True).annotate(women__count=Count('women')) у меня только с таким вариантом заработало, может кому-то понадобится)
@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')
@LukasFeinberg Жыл бұрын
20:46 И если вы делали это через пользовательские теги, как давал задачку автор, то ничего не случится :) Сначала нужно вернуть вывод верхнего меню как обычно.
@SITARNET Жыл бұрын
Может кто подскажет как это сделать? Я выводил меню через пользовательский тег!
@Tailiira Жыл бұрын
@@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 Жыл бұрын
@@Tailiiraпривет, у меня Menu подчеркнуто красным, хотя оно есть в файле с тегами, почему так?(
@nazi42410 ай бұрын
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'