Специальная, подарочная акция получения доступа к Django4!
Как, я, начал код писать в Python? Смотрите, если уперлись и ничего не получается.
Мы уже делали такое, но есть нечто новое для нас. давайте подробно разберём.
Нам нужно, что бы сохранение происходило без перезагрузки страницы, для этого нам и нужна эта функция.
Если ранее мы писали комментарии, там просто нужно добавить было функцию по которой мы писали middleware is_ajax() и просто вставили её в detail, здесь нужно ещё объяснить, когда сохранять. а когда не сохранять, поэтому проще написать отдельно.
Это для вас будет новое. Действительно Джанго умеет больше чем мы думаем. Она захватывает форму поста и переносит к нам. Так как там тоже создавался пост при помощи формы.
Вообще джанго может захватывать при помощи формы все что угодно. Это думаю многие не знают.
Мы с вами все сложили в голове. Исправили ошибки предыдущего кода и связали в голове, как будет работать код джанго с кодом js jquery ajax. И где нужно дописали
Посмотрите обзор, какой результат должны получить.
-
Объясняю на примере. Пишем представление для лайков django + Ajax.
Нам уже знакомо, как это пишется, так как мы писали уже комментарии.
Но я кое-что не сказал вам, главное.
Теперь когда у вас есть представление от ранее написанного, давайте писать лайки, но смотреть на это под другим углом.
Обратите внимание, как называются уроки? Верно - профессионально учимся писать представления.
Вот на этом и заострим внимание на профессионализме.
Следите за моим рассуждением именно поиском логики мы заёмемся.
И главное понять, что никакой логики для нашего представления для языка пайтон и для джанго нет, ни джанго ни язык
ничего не знают о логике.
Но они хорошо могут делать определённые действия, при помощи методов.
Важно понять, что саму логику знает только сам программист и в тот момент. когда мы для себя решили, что при клике сердечно будет красным, значит это нравится, а белым, значит не нравится.
именно поэтому мы создаём переменную liked(нравится) и для себя определяем, только для себя, но никак не для джанго или языка.
liked = False - не нравится.
liked = True - нравится.
А дальше начинает работать обыденная техническая сторона, а именно методы, которые хорошо умеет делать джанго.
Сначала, что б вам не дурили голову люди, которые вам будут перечислять навыки программирования, которые вы должны приобрести.
Я вам скажу все это у нас уже имеется.
Пример доказательство:
Мы заквасили бочку капусты, дальше себе думаем. что бы был сок и капкуста сохранилась нужно нажать её чем-то тяжёлым.
У нас в голове в нашей логике появляются два состояния придавлена крышка чем-то тяжелым или нет.
Это единственная логика, которая имеет значение, для сохранности капусты.
в программировании тоже самое можно выразить так:
cabbage_pressed = True (нажата)
cabbage_pressed = False (не нажата)
При этом заметьте, в программировании мы не создаём вторую переменную <капуста не нажата>, нам достаточно булевых значений TRUE (в любой ситуации ДА) - истина, FALSE - ложь (В любой ситуации НЕТ)
Вернёмся к бочке с капустой, далее думать не нужно, дальше вы нажимаете, тем что есть под рукой, камнем, автомобильным диском, гирей спортивной.
У вас в голове, есть, что - пойти и найти то чем нажать.
Ни бочка(язык), не капуста(джанго), ни гиря ничего не знают о чём вы думаете и о ваших планах сохранить капусту.
Теперь смотрите на код.
# @login_required def like_post(request): post = get_object_or_404(Post, id=request.POST.get('id')) # не понравилось liked = False if post.likes_post.filter(id=request.user.id).exists(): post.likes_post.remove(request.user) liked = False
видите строку.
liked = False
что об этом коде джанго джанго. Нихрена. Единтсвенное, что знает джанго что это ключевое слово вбитое в язык питон, как ложь.
Это у нас в голове есть замысел и только мы программисты это знаем.
В отличие от бочки с капустой у нас аналагичная ситуация технически, для нас будет иметь значение сердечко красное - нравится, сердечко белое - не нравится.
Ещё раз повтроряю, джанго ничего не знает о наших замыслах.
Но зато мы знаем о джанго многое и о её методах.
Мы логически думаем так примерно. Лайк будет к посту(на самом деле не имеет значения к чему видео, аудио и т .д.) Просто в данном случае к посту.
значит что нужно? Найти этот пост.
post = get_object_or_404(Post, id=request.POST.get('id'))
мы создаём переменную post и мы знаем, что у Джанго есть функция. которая может вернуть объект, джанго может вернуть любой веб объект, она не знает. что это страница нашего блога,
она просто может вернуть.
https://docs.djangoproject.com/en/4.1/topics/http/shortcuts/#get-object-or-404
....(Post, id=request.POST.get('id')) согласно документации, нам нужно указать модель, мы знаем, что писали модель поста и дальше опять же мы обладаем знанием, что любая запись в базе данных имеет свой id, то есть номер по которому её можно оттуда извлечь, поэтому мы пишем
id=request.POST.get('id')
как искать id?
запросить , не понимаете, что такое request? посмотрите этот плейц лист
https://www.youtube.com/playlist?list=PLuZJ9n46uMzUJrTZSCrDB126PgGzIRH0e
Основными знаниями. которые мы обладаем что данные в http протоколе могут передаваться GET (то что мы видем в строке браузера)
и POST
прочтите
https://developer.mozilla.org/ru/docs/Web/HTTP/Methods/POST
request - запросить
https://docs.djangoproject.com/en/4.1/ref/request-response/
POST - Вы уже видели, далее в уроках увидите, заостраю внимание, что мы будем делать файл html и в нем будет форма, ведь было бы не правильно, видеть в строке браузера, кто кликнул лайк, глупо, верно. Поэтому будет передоваться как форма, то есть браузер отправит серверу запрос, сервер выставит ключ, если ключи совпадут, то Джанго позволит операцию.
А что бы джанго позволила операцию. мы и пишем во первых.
как запросить
get('id')
get в данном случае это стандартный метод словаря питон
https://docs.python.org/3/library/stdtypes.html#dict.get
при этом мы его применяем, потому что знаем, что Джанго использует
словаре подобный класс, который понимает словари, поэтому мы можем использоват ьметод get словарей
https://docs.djangoproject.com/en/4.1/ref/request-response/#querydict-objects
нужно глянуть строки 61, 62
https://github.com/django/django/blob/main/django/http/request.py
и это гляньте внимательнее
И последнее id - это мы у себя в голове знаем. что любая база данных сохраняет любую запись под определённм номером. который называется id, вот мы и указываем. что его нужно извлечь.
Обратите внимание в этой строке нет и намёка на идентификацию, пользователя, то есть мы не видим слово user
Так как здесь идёт речь о том. что запись нужно излечь, ведь логично, как мы можем поставить лайк, если записи смой нет.
О том, кто может увидить запись мы позаботились заране вверху у нас стоит
@login_required
декоратор, который предполагает обязательную авторизацию пользователя.
Давайте прикинем, ведь мы пишим лайки и лайкать будет конкретный пользователь, значит нам его нужно определить, значит он обязательно должна быть авторизован, далее в шаблонах мы пропишем, что статью может увидеть и не авторизованный пользователь, но лайк поставить только авторизованный.(не заморачивайтесь, не хочу вас путать, пока это переворите)
Почему не получается у многих ребят писать, смотрите внизу знания и навыки.
Где собака порылась, отвлекаемся.
Но причина в другом. Пока мы не научимся отделять свою логику, что мы хотим сделать, от того что умеет делать джанго, мы не можем писать.
Почему?
Потому что мы и тольк омы хотим написать что-то, блог, бот, видео сервис и т .д. И логика известа только нам.
Джанго об этом ничего не знает.
Но зато джанго умеет делать много вещей хорошо, но связанных с извлечением конкретных данных.
ещё рас смотрите на это
get_object_or_404(.....) джанго имеет функцию, пот которой она извлечёт объект (ребята именно объект не больше) и этот объект должен быть именно http, если она его не найдёт, то вернёт исключение 404, в жизни -страницы не существует.
Я не зря сказал про объект. Ведь джанго не знает. что это статья, первая страница, видео, аудио, пдф документ, да что угодно.
Что делать. Разделить вашу логику и то что делает джанго.
Но ведь это просто, как с бочкой капусты. Ведь кирпич, ничего не знает о капусте и что он будет наживать крышку капусты, но это хорошо знаем мы и этот метод
get_object_or_404(.....), абсолютно идентичен, что вы пойдёте в сарай и возьмете кирпич, джанго пойдёт в базу и возьмёт запись с кокнретной модели.
И вы мне будете песни петь. что вы никогда не размышляли, как программист. Сами, то видите, что размышляли и не раз.
В этом случае Джанго работает с методами, а в примере с капустой Джанго это ваш дом и хозяйство, где есть сарай и в этом сарае есть кирпич, а вы как хозяин дома, прямо в жизни пишите этот метод, когда кладёте кирпич на крышку бочки. который нажимает капусту.
На каком этапе возникает путаница именно в книгах и материалах интернета. которые перепечатаны друг у дура.
Что происходит для новчика, который итак с большими глазами открывает книгу и читает и что он там видит........
Примерно так, есть кусок кода, который даётся и ниже описание, что делает этот кусок кода.
Новичок пыхтит, пишет в полусне и потом вдруг бац и заработало, громкий выдох(это я про себя лет 12 назад пишу), работает.
И, все попал парень в круг и потом годами из него не может выйти, все программирование начинает заключаться в поиске чего-то похожего.
Узнаете кто себя?
А как разорвать этот круг, понять, что отдельно программист и отдельно код языка и код фреймворка(любого)
Учить человека думать по человечески. вы же убедились на примере с капустой, что уже умеете так думать, так замените пример с капустой фреймворком и его функциями и методами.
Когда в книге идёт объяснение, что вот то-то и то-то происходит, но не объясняется, что происходит и должно происходить в голове программиста, то для новичка и получается. что вбивается мысль, что джанго умеет все и делает магически блог.
С этой статьи вы видите, что мы делаем блог, а джанго умеет только делать действия.
ещё раз посмотрите на пример
Давайте фишку проваливать у вас в голове.
Отвечайте сейчас на мои вопросы:
Что умеет делать Джанго в этой конкретной функции? Ваш ход. (не забудьте назвать это объектом)
Проверка понимания. Так все таки Джанго делает что когда вы применяете get_object_or_404(.....) . Она знает что вы задумали написать лайки? Ваш ход.
Или она просто извлекает объект, потому что просто умеет это делать именно эта функция? Ваш ход.
Ну не умерли от страха. Видите не все так страшно. а просто на самом деле.
Теперь к реальным ребятам перейдём.(это рассказать отдельно - для себя написал)
Кстати , сейчас занимаются ребята, imka(дима), keplerde(денис) swaytornado(дима) - все эти ребята сейчас должны решить этот вопрос и мы скоро увидим, их как рванет вперёд.
Приколько это наблюдать. Вы что думаете я зря дал задание imka научится применять параметры функций, не зря.
Ребята уже пишут, они то не знают. что скоро будут профессионально писать. а я это уже вижу и вижу. как исправить. Никакой магии, просто занимайтесь 14 лет и вы увидите.
прочтите.
Здесь в видео рассказать о прорыве Дмитрия imka.
Как я начал код писать в Python. Смотрите, если уперлись и ничего не получается. (вообще это видео, в описании ссылка на статьи полные)
Где возникает проблема и сразу же заливается бетоном в головах. Почему ребята, с нуля, которые либо посещают курсы, и там пишут приложение на Джанго или читают книги и так пишут сове первое приложение. В таком случае новичок не видит своей роли в этом процессе кроме повторения, соответственно он не может понять, как это работает, так как он настроен повторять, а его нужно учить разрабатывать. то есть отделить свою логику от того что умеет язык. фреймворк, библиотека.
Тогда все становится на свои места:
Новичок может быть программистом и должен быть с первых часов). Он задумывает, как в нашем случае написать лайк. Нужно ему рассказать, что Джанго о его замыслах ничего не знает.
Но Джанго имеет методы и функции, которые выполняют определённую работу и задача разработчика подобрать эти методы к своему замыслу.
Как в нашем примере. Что бы лайкнуть нужно сначала извлесь запись, что бы эта запись появилась ранее мы создали модель, по которой джанго создала таблицы в базе данных, мы одну из этих таблиц написали пост(ручками), и когда нам понадобилось написать лайки, мы про себя подумали. нам нужно эту самую статью, как то извлечь из базы и показать пользователю, ведь верно, иначе что он будет лайкать.
Так как мы точно понимаем, что хотим сделать и изучаем Джанго по методике Бовсуновского(а у меня пишут все и это не праздные слова и не выпендрёшь), то мы вспоминаем. что у Джанго есть функция, которая умеет извлечь объект. (именно объект, ведь на месте статьи может быть что угодно, видео, документа, переписка в чате и т .д)
мы заходим в доки
https://docs.djangoproject.com/en/4.1/topics/http/shortcuts/
что мы определяем по взгляду:
get_object_or_404(klass, *args, **kwargs)¶
это функция (мы учислись в школе Бовсуновского хорошо и уже давно прошли параметры и легко их видим, в том числе конечно и в документации.)
Читаем. по названию get_object_or_404 и описанию.
Запрос get()на заданном менеджере моделей, но это поднимает Http404вместо модели DoesNotExistисключение.
Ах он этот get(), отвлечёмся.
ведь мы уже видели какой-то get ранее
вот в начале id=request.POST.get('id'), полный пример
В документации говорится о get(), для get_object_or_404(), каким образом извлекаются данные, (то есть выборка объектов )
строка 605, то есть этот метод класса
class QuerySet(AltersData): строка 290.
https://github.com/django/django/blob/main/django/db/models/query.py
в то время то что внутри мы пишем
id=request.POST.get('id'), здесь get() метод словаря, ранее говорили почему
Вы удивлены, как так просто понимать. Ответ прост работать нужно с документацией, в курсе джанго в этом мы много работаем и ребята школы работают с исходным кодом сразу. как начинают учится:
смотрите видео и увидите:
https://spb-tut.ru/programming_school/python-programming-video/
Продолжим, ведь мы отвлекались.
В данном случаем, нам ничего не нужно придумывать. так как в джанго есть заготовка:
get_object_or_404(klass, *args, **kwargs)
Где первый параметр позиционный и является обязательным и требует передачи класса модели. Это логически выходит, так как это выборка объектов, а объекты выбираются с базы
https://docs.djangoproject.com/en/4.1/ref/models/querysets/#django.db.models.query.QuerySet.get
(мы просто это знаем и вы теперь). Теперь понимаете почему я говорю. что нужно разобраться с параметрами функций
(https://spb-tut.ru/%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB-%D1%81-%D0%BD%D1%83%D0%BB%D1%8F/%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D1%8B/%D0%BF%D0%BE%D0%B4%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB-python-kotlin-js-%D1%81-%D0%BD%D1%83%D0%BB%D1%8F/function-how-to/category/function-how-to/)
Зачем разбираться с параметрами?
Что бы читать документацию?
Что бы размышлять ими?
Что бы знать, что можно передавать, что нет.
Что нужно было понять до этого момента, только одно. Что есть Вы, программист и логика у Вас в голове. И есть язык и его фреймворки, там есть методы, которые делают полезную работу.
Мы подбираем эти методы, так же логически. как подбираем чем нажать капусту, что бы работа была выполнена. В ситуции со статьёй блога, нам просто подходит метод,
, так как он отвечает нашим требованиям, а наше требование извлечь из базы статью.
Нам для этого нужно указать наш класс и дальше то что нам нужно, так как мы далее читаем
любые позиционные и именованные аргументы, а это как раз и есть именованный аргумент. (я говорил. что функции нужно затереть до дыр, идите трите)
id=request.POST.get('id'))
И здесь нет никакой магии, все очевидно(для учатников школы Бовсуновского и кто все же занимается по системе и начал джанго с нуля
https://spb-tut.ru/%D1%83%D1%80%D0%BE%D0%BA%D0%B8-django-4/%D0%B2%D1%85%D0%BE%D0%B4%D0%B8%D0%BC-%D0%B2-django-4/
разберём, что происходит, как не запутаться во всем этом (здесь должны быть отработаны знания работы с атрибутами классов питон и общее знание классов)
сама функция get, по шаблону которой работает
get_object_or_404()
просто выполняет алгоритм поиска по полям: по тупому принципу
https://docs.djangoproject.com/en/4.1/ref/models/querysets/#field-lookups
Entry.objects.get(id__exact=14)
Entry модель в нашем случае Post называется модель.
objects - стандартная утилита Джанго, которая просто умеет искать поля и выбирать
id__exact=14 - пример выбора записи по конкретному номеру записи.
соответсвенно, нам нужно задать эти самые параметры поиска. что мы и делаем вот этой строкой
id=request.POST.get('id'), полный пример
Мы это уже обсуждали выше.
так что путаться то не в чём.
Ну а дальше все просто, но просто для участника школы Бовсуновского, который проделал все уроки, ведь мы не первый раз уже пишем такие представления, то есть мы сначала понимали общую логику. теперь перешли к такому углу зрения, что бы программист видел свою роль.
Остальной кусок кода. # не понравилось liked = False if post.likes_post.filter(id=request.user.id).exists(): post.likes_post.remove(request.user) liked = False
Вы уже должны быть немного с опытом. понаторели по ходу чтения:
Спрашиваю.
что такое liked именно смысл Джанго знает? Ваш ход.
Ничего она не знает и никто не знает кроме нас с вами.
Вы спросите вопрос,а как же Джанго узнает, что нужно поставить отметку нравится или не нравится.
Да ничего он не будет знать.
Так а кто будет знать? Ваш ход.
Ни джанго ни написанная нами функция не будет знать, когда что-то нравится или что-то не нравится.
Но мы точно можем знать. что хотим.
Далее с участниками будем делать и уже делали.
Мы создадим .html файл и создадим форму, помните мы указывали в функции, что нам нужен POST запрос.
Так вот смотрите:
кстати тег формы к джанго не имеет отношения это вам нужно набрать html5 гипертектовая разметка.
нам нужно вбить два положения, если один раз кликнул, то значит нравится.
Если ещё раз кликнул значит не нравится.
<form>
1 положение
if вот здесь будет наша переменная liked = False (которую мы превратим в контекст, то что будет понимать шаблон Джанго.
обратите внимание когда мы начали писать логику, то первая строка
liked = False, то есть сердечко белое.
белое сердечко
else 2 положение нравится.
красное сердечко.
</form>
что нам осталось сделать, так в эту форму разместить две иконки, одну белое сердечко, другую красное сердечко.
Сложно?
Так, что в данном случае Джанго знает о нашем замысле? Ваш ход.
Теперь мы будем подбирать в Джанго методы, которые нам нужны.
нам нужно две операции в целом.
Что бы в одном случае при клике, появлялась иконка с красным сердечком и происходила запись в базе данных.
Во втором случае, появлялась белая иконка и удалялась запись об это с базы данных.
Дальше все просто.
if post.likes_post.filter(id=request.user.id).exists(): post.likes_post.remove(request.user) liked = False
Строка
if post.likes_post.filter(id=request.user.id).exists():
обычное ветвление, как в случае с капустой, снять кирпич, положить на курышку.
Только в Джанго ведь мы делали блок, не забыли.
ранее мы точно поределили пользователя, Далее все просто, мы точно знаем, что нам нужно удалить запись,
вот и добавляем.
нашу переменную post(все как ранее)
указываем таблицу модели.
и стандартный метод Джанго, который умеет удалять remove()
https://docs.djangoproject.com/en/4.1/ref/models/relations/#django.db.models.fields.related.RelatedManager.remove
post.likes_post.remove(request.user) liked = False
likes_post = models.ManyToManyField( User, related_name='post_likes', blank=True, verbose_name='Лайки')
Соотвественно далее мы напишем с участниками ещё один кусок кода, где нужно будет добавить.
Нам осталось ещё немного, для полного понимания.
А именно, зачем нам Ajax.
Мы себе думаем, что нам хотелось бы, что бы лайк ставился без перезагрузки страницы.
В данном случае будем делать с Jquery.
Js будем учить работать с питон.
Js это совсем тупое создание, так что короткий поводок.
Но есть умное создание Jquery
нам нужно написать функцию по шаблону и разместить код в html, здесь не буду перегружать. а расскажу суть, будет больше пользы.
Что нам нужно от JS, нам нужна одна вещь,
http://api.jquery.com/jquery.ajax/
Здесь нет проблем.
JS будет работать так как он умеет используя свои типы данных, а питон, вернее Джанго,
заберёт эти данные, при помощи загатовленного ранее метода JsonResponse(), который есть в джанго и он умеет переводить данные. которые в формате json в типы данных питон.
нам просто нужно добавить в нашу функции такой код.
if request.is_ajax(): html = render_to_string('blog/like_section.html', context, request=request)
Примечание. В джанго 4 убрали метод is_ajax(), но все же я считаю. что Jquery недооцененная библиотека, и я решил написать middleware, который вернул Джанго эту функцию.
Мы будем делать и другими способами, но я подумал. пусть у ребят будет и этот способ, он очень простой и пишется в пару строк.
middleware, что это и как работает рассказал здесь, точно уловите принцип
https://www.youtube.com/watch?v=UtUcrvT0AAg&list=PLuZJ9n46uMzUJrTZSCrDB126PgGzIRH0e&index=1&t=2990s
Нам осталось понять. как этот весь механизм запуститься.
по url
когда пользователь попадёт на url неважно как, по ссылке, с поиска и т .д
сначала откроется по ссылке сама статья блога
path('post/<int:pk>/', views.post_detail_view, name='post-detail'),
А вот картинка наше сердечко будет иметь свою ссылку, известную только нам и JS, по этой ссылке будут передаваться данные на сервер
path('post/like/', views.like_post, name='post-like'),
как видите есть наша функция
views.like_post. при наборе url она сработает
Ну и стоит обратить внимание на начало функции:
def save_post(request):
видите request здесь об этом говорил
Что нужно знать джанго о сервере она сама извлечёт при помощи HttpRequest.(загаловок, адрес, куки и т .д все что необходимо знать о странице, для нормальной работы)
и при этом сам пост не будет об этом ничего знать, помните, как я вас учил.
Мой вопрос. Кто знает логику? ваш ход.
Как я начала программировать добавить статью:
Посмотрите видео в описании есть ссылки на статью и прочтите больше будете понимать и быстрее начнёте писать:
https://www.youtube.com/watch?v=jcf5eYKycJs&t=604s
Рекомендуется оценить мощь. Обязательно глянь подборку видео, как растут ребята, у тебя тоже получится.
Подборка видео, для прорыва в мозгах, изменит подход к изучению программирования.
здесь с ребятам я занимаюсь бесплатно в группе, направляю, кто хочет. все получается. Ведь какая проблема у новичка, он не знает на что уделить внимание, что бы программировать, а у меня на этом построена школа, то есть школа может быть полезна, даже если вы где-то учитесь, просто увеличите эффективность. когда будете понимать. как изучать программирование и язык не имеет значения.
Купите доступ и учитесь, все получится. сами убедились, что действия, как в программировании вы делаете каждый день, так в чём проблема.
Только в одном. К программированию нужно подходить особым образом, вы уже наверное смотрели, что это значит и как:
Джанго + Питон:
https://spb-tut.ru/programming_school/pay-django4/
Либо Джанго + Питон + Блокчейн:
(Хит продаж) Внизу страницы 400 BYN:
https://spb-tut.ru/programming_school/pay-dapp-spb-tut-ru/
Обучение программированию по индивидуальной программе.(очень круто)
https://spb-tut.ru/programming_school/individual-programming-training/
Групповые занятия по программированию(весело и круто).
https://spb-tut.ru/programming_school/group-programming-lessons/
Все получится точно.
< 1 2 3 ... 6 7 8 9 >