Evgenii Legotckoi
Evgenii LegotckoiСәуір 8, 2017, 7:52 Т.Ж.

Джанго - Сабақ 022. Сайтқа бетбелгілер жүйесін (таңдаулылар) қосу

Сайт форумдағы мақалаларды, пікірлерді, тақырыптарды және жауаптарды таңдаулылар ретінде белгілеу мүмкіндігін қосты. Сонымен қатар, таңдаулы ретінде белгілеу бетті қайта жүктеуді қамтымайды, өйткені бұл әрекеттер AJAX сұрау механизмін пайдаланады.

Бетбелгі жүйесін енгізу үшін сізге қажет:

  • Пайдаланушы мен мақала немесе түсініктеме арасындағы «Көптен көпке» қатынасын жүзеге асыратын кестені қосыңыз.
  • Осы сұрауды өңдейтін көріністі қосыңыз.
  • Таңдаулыларға объект қосу немесе алып тастау сұрауын өңдеу үшін url қосыңыз.
  • Бетбелгілерге қосылған есептегішті көрсетуге жауап беретін html-кодты жазыңыз.
  • AJAX сұрауын жасайтын JavaScript өңдеушісін қосыңыз.

Бұл сайтта Bootstrap жүйесіндегі жұлдызша белгішесі есептегіш белгіше ретінде пайдаланылады.


Бетбелгілерге арналған "Көптен көпке" кестесі

Мақалалар мен пікірлерге бетбелгілер қосу мүмкіндігін берейік. Ол үшін біз жалпы дерексіз үлгіні жасаймыз, одан біз сайттағы мазмұнның белгілі бір түрі үшін мұра аламыз. Абстрактілі модельде біз барлық бетбелгі үлгілері үшін бірдей болатын пайдаланушы өрісін жасаймыз.

class BookmarkBase(models.Model):
    class Meta:
        abstract = True

    user = models.ForeignKey(User, verbose_name="Пользователь")

    def __str__(self):
        return self.user.username

Әрі қарай, түсініктемелер мен мақалалар үшін екі бөлек деректер үлгісін жасау үшін осы үлгіден мұра аламыз.

Мұнда біз мазмұн кестесінің сыртқы кілтіне жауап беретін obj өрісін қосамыз: Мақала немесе Түсініктеме. Өрістің екі үлгіде де бірдей аталуы маңызды. Содан кейін барлық бетбелгі кестелері үшін бір көрініс жазуға болады.

class BookmarkArticle(BookmarkBase):
    class Meta:
        db_table = "bookmark_article"

    obj = models.ForeignKey(Article, verbose_name="Статья")


class BookmarkComment(BookmarkBase):
    class Meta:
        db_table = "bookmark_comment"

    obj = models.ForeignKey(Comment, verbose_name="Комментарий")

рет көру.py

Бетбелгілерге қосу немесе бетбелгілерден жою сұрауын өңдеу үшін біз жоғарыда ұсынылған жалпы көріністі қанағаттандыратын кез келген бетбелгі кестесімен жұмыс істей алатын көріністі жасаймыз.

# -*- coding: utf-8 -*-

import json

from django.contrib import auth
from django.http import HttpResponse
from django.views import View


class BookmarkView(View):
    # в данную переменную будет устанавливаться модель закладок, которую необходимо обработать
    model = None

    def post(self, request, pk):
        # нам потребуется пользователь
        user = auth.get_user(request)
        # пытаемся получить закладку из таблицы, или создать новую
        bookmark, created = self.model.objects.get_or_create(user=user, obj_id=pk)
        # если не была создана новая закладка, 
        # то считаем, что запрос был на удаление закладки
        if not created:
            bookmark.delete()

        return HttpResponse(
            json.dumps({
                "result": created,
                "count": self.model.objects.filter(obj_id=pk).count()
            }),
            content_type="application/json"
        )

Бұл код obj_id=pk салыстыруды пайдаланғанын ескеріңіз, бұл біз нысан идентификаторы бойынша бетбелгі кестесіндегі жазбаны табуға тырысып жатқанымызды білдіреді. Бұл өріс барлық үлгілерде бірдей болғандықтан, бұл синтаксисте проблемалар болмауы керек.

urls.py

Енді бетбелгілерге мазмұн қосу сұрауларын өңдеуге арналған URL мекенжайлары қалай көрінетінін көрейік.

# -*- coding: utf-8 -*-

from django.conf.urls import url
from django.contrib.auth.decorators import login_required

from . import views
from users.models import BookmarkArticle, BookmarkComment

app_name = 'ajax'
urlpatterns = [
    url(r'^article/(?P<pk>\d+)/bookmark/$',
        login_required(views.BookmarkView.as_view(model=BookmarkArticle)),
        name='article_bookmark'),
    url(r'^comment/(?P<pk>\d+)/bookmark/$',
        login_required(views.BookmarkView.as_view(model=BookmarkComment)),
        name='comment_bookmark'),
]

Бұл сұрауды орындау үшін пайдаланушы жүйеге кіруі керек, бұл логин_талап етілген декораторының жауапкершілігі.

Бұл жағдайда URL мекенжайы мазмұнның қандай түріне бетбелгі қойылғанын анықтайды, сонымен қатар сол мазмұнның pk мәнін және орындалатын әрекетті анықтайды. Шынында да, бетбелгілерді қосудан басқа, сіз ұнатулар, репосттар және т.б. жүйесін қоса аласыз. сол принцип бойынша.

html

Менің жағдайда html коды келесідей көрінеді:

<div data-id="{{ like_obj.id }}" data-type="article" data-action="bookmark" title="Избранное">
    <span class="glyphicon glyphicon-star"></span>
    <span data-count="bookmark">{{ like_obj.get_bookmark_count }}</span>
</div>

Мұнда бірнеше теңшелетін атрибуттар бар:

  • data-id - бетбелгі қоюға болатын pk мазмұнына жауапты.
  • деректер түрі - мазмұн түрі, URL мекенжайында бірдей атау пайда болады.
  • деректер-әрекет - орындалатын әрекет, бұл жағдайда бетбелгі қою
  • деректер саны - қанша пайдаланушы мазмұнды белгілегенін көрсететін есептегіш

Келесі like_obj.get_bookmark_count, кодына келетін болсақ, бұл да мазмұн үлгісіне қосылған біркелкі әдіс, мысалы, мақалалар үшін ол келесідей болады:

def get_bookmark_count(self):
    return self.bookmarkarticle_set.all().count()

JavaScript

Бұл функцияға арналған AJAX сұраулары jQuery кітапханасы арқылы жасалады.

AJAX-пен жұмыс істегенде есте сақтау керек бірнеше нәрсе бар:

  1. Егер сізде ағымдағы тілде ерекшеленетін URL мекенжайлары бар көптілді сайт болса, онда тілден тәуелсіз AJAX үшін бөлек api жасаған дұрыс, әйтпесе тілде тілді ескеру қажет болады. url AJAX сұрауын жасау кезінде. Егер тіл ескерілмесе, онда AJAX сұрауы тілді ескере отырып, ағымдағы URL мекенжайына қайта бағытталады және сұрау жұмыс істемейді. Яғни, қайта бағыттаулар болмауы керек.
  2. Сайттар аралық сұрауды қолдан жасаумен күресу үшін пайдаланылатын CSRF таңбалауышын пайдалану үшін конфигурацияланбаса, Django AJAX сұрауын қабылдамайды. Әрбір бет сұрауымен Django CSRF таңбалауышын cookie файлдарына араластырады, сол жерден оны алуға болады.

CSRF таңбалауышын пайдалану үшін AJAX теңшеу

Келесі кодты AJAX пайдалану қажет сайттың әрбір бетіндегі сценарийге қосуға болады. Ол CSRF таңбалауышын пайдалану үшін AJAX-ты автоматты түрде конфигурациялайды.

// Получение переменной cookie по имени
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

// Настройка AJAX
$(function () {
    $.ajaxSetup({
        headers: { "X-CSRFToken": getCookie("csrftoken") }
    });
});

Бетбелгі өңдеушілері және олардың қосылымы

Келесі код бетбелгілерден мазмұнды қосу немесе жою үшін AJAX сұрауын жасайды. Бұл жағдайда код мақалалар үшін де, түсініктемелер үшін де әмбебап болады.

Сұраныс url мекенжайында келесі жолды көре аласыз "/api/" + type + "/" + pk + "/" + action + "/", бұл AJAX сұрауларына арналған модульдің ілулі тұрғанын білдіреді. префиксі /api / , яғни ол негізгі urls.py жоба файлындағы осы URL мекенжайына қосылған, одан кейін мазмұн түрі, оның негізгі кілті және орындалатын әрекет. Бұл деректердің барлығы деректер, атрибуттарынан алынғандықтан, соңғы url келесідей болады:

  • /api/article/112/bookmark/ - мақалалар үшін
  • /api/comment/14/bookmark/ - түсініктемелер үшін

Сәтті өңдегіште ағымдағы пайдаланушы үшін бетбелгі жұлдызын бөлектеуді қосуға болады, т.б.

function to_bookmarks()
{
    var current = $(this);
    var type = current.data('type');
    var pk = current.data('id');
    var action = current.data('action');

    $.ajax({
        url : "/api/" + type + "/" + pk + "/" + action + "/",
        type : 'POST',
        data : { 'obj' : pk },

        success : function (json) {
            current.find("[data-count='" + action + "']").text(json.count);
        }
    });

    return false;
}

// Подключение обработчика
$(function() {
    $('[data-action="bookmark"]').click(to_bookmarks);
});

Django үшін Timeweb хостының VDS-сервері ұсынамын.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

ИМ
  • Ақп. 3, 2018, 5:40 Т.Қ.

Доброго времени суток Евгений. Не подскажете как сделать иконки (лайк-дизлайк) кликабельными?

ИМ
  • Жел. 1, 2018, 5:57 Т.Қ.

Доброго времени суток Евгений. Не ясен метод:

def get_bookmark_count(self):
    return self.bookmarkarticle_set().all().count()

Не могли бы вы растолковать откуда моя модель статьи знает о этой функции?:

self.bookmarkarticle_set()

Когда применяю данный метод то выскакивает ошибка:

__call__() missing 1 required keyword-only argument: 'manager'

И второй вопрос каким образом можно подсвечивать закладку (допустим менять ее цвет когда она добавлена пользователем, ну как у вас на сайте)?

Evgenii Legotckoi
  • Жел. 2, 2018, 5:57 Т.Қ.

Добрый день, Игорь!

Вообще это стандартное поведение в моделях, если на данную модель какая-то иная модель имеет внешний ключ (ForeignKey)

В данном конкретном случае есть модель Article и BookmarkArticle , поскольку BookmarkArticle имеет внешний ключ на Article, то модель Article автоматически получает метод bookmarkarticle_set, который возвращает query set  всех закладок, которые имеют внешний ключ на конкретный объект статьи.

Здесь я по ходу допустил ошибку, напишите так

self.bookmarkarticle_set.all().count()

Для подсветки я использую фильтр в шаблоне, которые ищет пользователя в наборе

@register.filter
def user_in(objects, user):
    if user.is_authenticated:
        return objects.filter(user=user).exists()
    return False

а вот его применение

<span data-icon="favorite" class="mdi mdi-star mr-1 {% if obj.bookmarks.all|user_in:user %}text-success{% endif %}"></span>

ИМ
  • Жел. 3, 2018, 11:55 Т.Ж.

self.bookmarkarticle_set.all().count()

Да, так все работает! Спасибо вам огромное.

Еще один вопрос:

Я подключил фильтр:

@register.filter
def user_in(objects, user):
    if user.is_authenticated:
        return objects.filter(user=user).exists()
    return False

в templatetags/movie_extras.py

в шаблоне:

{% load movie_extras %}
<span style="cursor: pointer" class="fa fa-bookmark-o fa-4x{% if movie.bookmarks.all|user_in:user %}fa-2x{% endif %}"></span>

При этом ошибка:

 File "/home/chunk/public/web-dev/testproj/movie/templatetags/movie_extras.py", line 8, in user_in
    return objects.filter(user=user).exists()
AttributeError: 'NoneType' object has no attribute 'filter'

что я делаю не так Евгений?







Evgenii Legotckoi
  • Жел. 3, 2018, 12:58 Т.Қ.

мне кажется, вы неправильно записали это

movie.bookmarks.all

Как у вас называется модель закладок для фильмов? BookmarkArticle? BookmarkMovie?

Я вам дал код из сайта, а здесь уже на десять раз всё переписано и выглядит иначе. У вас скорее всего как-то так должно быть.

movie.bookmarkmovie_set.all

Или что-то типо того

ИМ
  • Жел. 3, 2018, 1:10 Т.Қ.

Все верно.

Я вам дал код из сайта, а здесь уже на десять раз всё переписано и выглядит иначе. У вас скорее всего как-то так должно быть.
self.bookmarkarticle_set.all().count()

Так все работает. Только у меня:

self.bookmarkmovie_set.all().count()

Фильтр к сожалению не работает.












Evgenii Legotckoi
  • Жел. 3, 2018, 1:22 Т.Қ.

так перепишите его так

{% if movie.bookmarkmovie_set.all|user_in:user %}fa-2x{% endif %}
ИМ
  • Жел. 3, 2018, 1:26 Т.Қ.

Все работет Евгений. Спасибо вам.

ИМ
  • Жел. 5, 2018, 4:44 Т.Ж.

Доброго времени суток Евгений. Можно поинтересоваться каким образом выводите закладки в профиле пользователя?

Evgenii Legotckoi
  • Жел. 5, 2018, 4:47 Т.Ж.

Добрый день, Игорь.

Во вьшке находите в базе данных пользователя, а потом забираете все закладки аналогично, как сделали для фильмов. К пользователю также добавляются неявно методы соответствующих моделей данных, которые имеют внешний ключ на пользователя.

user.bookmarkmovie_set.all()



ИМ
  • Жел. 5, 2018, 4:54 Т.Ж.

Спасибо Евгений, буду пробовать.

ИМ
  • Жел. 5, 2018, 5:16 Т.Ж.

Ну с выводом кол-ва закладок пользователя разобрался успешно,  а вот с выводом содержимого закладок почему то не могу сообразить. Прошу помощи Евгений.

Evgenii Legotckoi
  • Жел. 5, 2018, 5:20 Т.Ж.

Покажите шаблон, где выводите закладки, но без контента

ИМ
  • Жел. 5, 2018, 5:22 Т.Ж.
{% extends 'base/base.html' %}
{% block content %}
<div class="userprofile">
<div class="row">
    <div class="col-md-3">
		{% if user.avatar %}
			<img src="{{ user.avatar.url }}">
		{% else %}
			<img src="/static/img/noavatar.png">
		{% endif %}
	</div>
    <div class="col-md-9">
		{{ profile.username }}
		<ul class="nav nav-tabs" id="myTab" role="tablist">
  <li class="nav-item">
    <a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Home</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" id="profile-tab" data-toggle="tab" href="#profile" role="tab" aria-controls="profile" aria-selected="false">Закладки {{ user.bookmarkmovie_set.all.count }}</a>
  </li>
  <li class="nav-item">
    <a class="nav-link" id="contact-tab" data-toggle="tab" href="#contact" role="tab" aria-controls="contact" aria-selected="false">Contact</a>
  </li>
</ul>
<div class="tab-content" id="myTabContent">
  <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">...</div>
  <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">...</div>
  <div class="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">...</div>
</div>
		<p></p>
	</div>
</div>
</div>
{% endblock %}
Evgenii Legotckoi
  • Жел. 5, 2018, 5:30 Т.Ж.

хм.. для вывода тогда должно быть как-то так

{% for bookmark in user.bookmarkmovie_set.all %}
    {{ bookmark .movie.title }}
{% endfor %}

Думаю, что догадаетесь как вывести нужную информацию о фильме

bookmark.movie - означает, что вы берёте поле внешнего ключа на фильм, которое должно быть в закладке. полагаю, что онго должно называться movie

ИМ
  • Жел. 5, 2018, 5:32 Т.Ж.

Ага цикл. Спасибо за разъяснение Евгений.

ab
  • Қаз. 26, 2019, 2:02 Т.Ж.

здраствуйте. У меня почему-то выходит так

ab
  • Қаз. 26, 2019, 2:02 Т.Ж.

здраствуйте. У меня почему-то выходит так

Evgenii Legotckoi
  • Қаз. 26, 2019, 1:58 Т.Қ.

url или не подключили, или подключили неправильно

progammist
  • Сәуір 29, 2020, 7:37 Т.Ж.

Подскажите пожалуйста, что значит

#app_name = 'ajax'

в urls.py ??
Это надо новое приложение создать?

Evgenii Legotckoi
  • Сәуір 29, 2020, 7:46 Т.Ж.

Да, для такого функционала лучше создать отдельное приложение. Причина предельно простая. Обычно, когда делают сайт на Django, то очень часто делают его мультиязычным. Поэтому всё, что касается ajax взаимодействия, лучше пускать мимо дистпечеризации urls с поддержкой мультиязычности. Такая проблема возникает вследствие того, что производится переадресация на url, который зависит от языка. Из-за переадресации неправильно работает js.

Тут два решения проблемы:

  1. Выковыривать язык из страницы, чтобы сформировать url и биться со следующими багами
  2. Пустить этот функционал в обход мультиязычности, что гораздо проще и с меньшим количеством последующих багов
progammist
  • Сәуір 29, 2020, 7:48 Т.Ж.
  • (өңделген)

ок, понял, спасибо
А в новом приложении строку app_name = 'ajax' указывать в урл?

Evgenii Legotckoi
  • Сәуір 29, 2020, 7:51 Т.Ж.

Да, нужно будет добавить файл urls, поскольку обычно при использование команды startapp это файл не создаётся, и потом в нём обязательно добавить app_name, можете присовить своё имя для него. app_name отвечает за контекс генерирования url

progammist
  • Сәуір 29, 2020, 8:01 Т.Ж.
  • (өңделген)

подскажите еще пж, я правильно понимаю, что функцию:

def get_bookmark_count(self):
    return self.bookmarkarticle_set.all().count()

Нужно добавить в модель статьи?

И еще второй вопрос, вроде всё сделал, при клике на звездочку (кстати у меня она не отображется, просто пустое место, но при клике что-то срабатывает) ничего не происходит, в консоле: Not Found: /api/article//bookmark/

Evgenii Legotckoi
  • Сәуір 29, 2020, 8:06 Т.Ж.
  1. Да
  2. У вас тут должен быть id статьи, то есть эта запись /api/article//bookmark/ должна выглядеть например так /api/article/666/bookmark/
    Так что ищите косяк где-то в js
progammist
  • Сәуір 29, 2020, 8:06 Т.Ж.

Ок, а посмотреть добавленные закладки на каком урл можно будет после добавления?

Evgenii Legotckoi
  • Сәуір 29, 2020, 8:08 Т.Ж.

на том, который сами наваяете, если на пользовательском фронтенде, а вообще добавляйте модель закладок в панель администрирования в файле admin.py, тогда сможете увидеть в админке, добавилось там что-нибудь или нет.

progammist
  • Сәуір 29, 2020, 1:34 Т.Қ.

Не получилось у меня сделать с ajax, по всей видимости пробелма с получением ID поста. Попробовал без ajax, по сути таже ошбика(какие-то проблемы с id). Создал новый вопрос: https://evileg.com/ru/forum/topic/1329/ , не знаю как пофиксить.

progammist
  • Сәуір 30, 2020, 6:52 Т.Ж.

Подскажите, а дейтсвие:

data-action - действие, которое нужно совершить, в данном случае добавление в закладки
data-action="bookmark"

В какой части кода описываем?

Evgenii Legotckoi
  • Сәуір 30, 2020, 7 Т.Ж.
ction to_bookmarks()
{
    var current = $(this);
    var type = current.data('type');
    var pk = current.data('id');
    var action = current.data('action'); // ЗДЕСЬ

    $.ajax({
        url : "/api/" + type + "/" + pk + "/" + action + "/",
        type : 'POST',
        data : { 'obj' : pk },

        success : function (json) {
            current.find("[data-count='" + action + "']").text(json.count);
        }
    });

    return false;
}
progammist
  • Сәуір 30, 2020, 7:23 Т.Ж.
  • (өңделген)

Вообщем решил сделать не по id, а по slug, что в итоге вышло:

urls.py

app_name = 'ajax'
urlpatterns = [ url('<slug:slug>/', login_required(views.BookmarkView.as_view(model=BookmarkArticle)), name='article_bookmark'),

в .js

function to_bookmarks()
{
    var current = $(this);
    var type = current.data('type');
    var pk = current.data('id');
    var action = current.data('action');

    $.ajax({
        url :   "/" + pk + "/" ,
        type : 'POST',
        data : { 'obj' : pk },

        success : function (json) {
            current.find("[data-count='" + action + "']").text(json.count);
        }
    });

    return false;
}

// Подключение обработчика
$(function() {
    $('[data-action="bookmark"]').click(to_bookmarks);
});

В шаблоне:

<div data-id="{{ post.slug }}" data-type="post" data-action="bookmark" title="Избранное">
    <span class="far fa-heart"></span>
    <span data-count="bookmark">{{ post.get_bookmark_count }}</span>
</div>

В итоге при клике на иконку в консоле получаю:

[30/Apr/2020 16:21:00] "POST /novayastatya/ HTTP/1.1" 200 7405

Счётчик при клике на иконку никак не обновляется 0 всегда, также в БД таблица bookmark_article пустая. Может быть с урлами что-то?

progammist
  • Сәуір 30, 2020, 7:29 Т.Ж.
  • (өңделген)

Также попробовал нажать на иконку для неавторизованного пользователя, аналогично:

[30/Apr/2020 16:21:00] "POST /novayastatya/ HTTP/1.1" 200 7405

То есть @login_required не срабатывает

progammist
  • Сәуір 30, 2020, 7:17 Т.Қ.
  • (өңделген)

Евгений, можете подсказать почему может быть так?

Evgenii Legotckoi
  • Мамыр 3, 2020, 5:22 Т.Қ.

А вы js код где подключаете?

файл js с to_bookmarks можно загрузить в head теге, а вот этот код

$(function() {
    $('[data-action="bookmark"]').click(to_bookmarks);
});

должен вызываться в конце страницы, когда html загружен

progammist
  • Мамыр 3, 2020, 8:19 Т.Қ.
  • (өңделген)

Загрузил в конце страницы - ситуация аналогичная. Клик нажимается, в консоле

 "POST /novayastatya/ HTTP/1.1" 200 7405

Но счетчик не обновляется и в базе нет записи. У меня подозрения, что не срабатаывает url.

urls.py

app_name = 'ajax'

urlpatterns = [
    url('/api/favourites/', login_required(views.BookmarkView.as_view(model=BookmarkArticle)),
        name='article_bookmark'),
]

Урл нигде не перподключал, создал новое app "ajax" в нём добавил urls.py и в него добавил код выше. Может быть надо где-то include url вставить?

И еще немного симптомов, если я убираю во views.py (ajax app) класс BookmarkView(View) , то ничего не меняется (никаких ошибок нет). Но в коносле POST запрос ("POST /novayastatya/ HTTP/1.1" 200 7405) при клике всё равно пишет. Получается урл не срабатывает или view, а может и с моделями что-то...

Evgenii Legotckoi
  • Мамыр 4, 2020, 2:54 Т.Ж.

А вы эти urls вообще подключили в самом главном файле urls, который обычно находится рядом с файлом settings.py?

progammist
  • Мамыр 4, 2020, 3:05 Т.Ж.

нет, а как?)

Evgenii Legotckoi
  • Мамыр 4, 2020, 3:25 Т.Ж.

также, как подключили сами статьи в файле urls.py, который лежит рядом с settings.py. Статьи же у вас работают...

progammist
  • Мамыр 4, 2020, 3:36 Т.Ж.
  • (өңделген)

я не понимаю, как нужно подкллючить url из ajax app. Сатьи у меня лежат в главном приложении

Статьи я подключил вот так:

path('<slug:slug>/', views.post_detail, name='post_detail')

А как подключить url'ы приложения ajax app ?

Evgenii Legotckoi
  • Мамыр 4, 2020, 3:47 Т.Ж.
  • (өңделген)

боюсь, что вам это слабо поможет, но обычно url из других app подключают подобным образом

urlpatterns = [
    path('api/', include('ecore.urls')),
]

Постарайтесь разобраться с этим, а то у меня возникает ощущение, что вас за руку водить нужно. Поэтому я склоняюсь к тому, что вы рано начали решать свою задачу. Вам нужно поднабраться опыта с Django. Поэтому переключитесь на какие-нибудь другие задачи, а добавление в избранное реализуете позже.

progammist
  • Мамыр 7, 2020, 4:04 Т.Қ.

За неделю я разобрался и нашел где была ошибка, сейчас закладки добавляются успешно.

Сейчас новый вопрос, как можно их вывывести?
Пытаюсь вывести в шаблоне:

{% for bookmark in user.bookmarkarticle_set.all %} 
{{ bookmark.post.title }} #модель статьи Post
{% endfor %}

Ничего не выводится. Вьюху не создавал, не имею понятия как. Подскажите как вывести закладки юзера?

Evgenii Legotckoi
  • Мамыр 8, 2020, 10:12 Т.Ж.

Добрый день.
То, что вы добавили как статью, следовало добавить как вопрос на форуме. ЭТо не статья, вы описали, что сделали и спрашивайте, что делать дальше. Поэтому задайте именно вопрос на форуме, в противном случае я не могу пропустить ту статью, чтобы другие пользователи имели к ней доступ. Она не соответсвует наименованию статьи.

Но суть вашей проблемы в том случае заключается в том, что вы не забираете список постов в соответствии с пользователем.
Поскольку никак не передаёте информацию о пользователе во view

progammist
  • Мамыр 9, 2020, 12:19 Т.Қ.

ок, немного промазал при создании)
создал вопрос к статье: https://evileg.com/ru/forum/topic/1345/

progammist
  • Мамыр 9, 2020, 12:27 Т.Қ.
  • (өңделген)
> Но суть вашей проблемы в том случае заключается в том, что вы не забираете список постов в соответствии с пользователем.
Поскольку никак не передаёте информацию о пользователе во view

Вы можете показать пример как это сделать?

progammist
  • Мамыр 10, 2020, 9:01 Т.Ж.

всё, разобрался

progammist
  • Мамыр 10, 2020, 9:23 Т.Ж.

Оставлю для тех, у кого возникнет подобный вопрос. Посты выводим циклом:

{% for bookmark in user.bookmarkarticle_set.all %} 
{{ bookmark.obj.title }} 
{% endfor %}

Так как мы ссылаемся на обьект статьи в модели BookmarkArticle через переменную obj , то и доступ к статье получаем через неё:

{{ bookmark.obj.title }} 
progammist
  • Мамыр 13, 2020, 7:20 Т.Ж.
  • (өңделген)

Как я могу вывести добавленные посты в обратном порядке? сейчас выводятся новодобавленные в конец. Пыатюсь добавить order_by('-created_on') :

views.py

    object_list =  User.bookmarkarticle_set.all().order_by('-created_on')

Ошибка:

Cannot resolve keyword 'created_on' into field.
Evgenii Legotckoi
  • Мамыр 13, 2020, 7:24 Т.Ж.

Может так?

object_list =  User.bookmarkarticle_set.all().order_by('-obj__created_on')
progammist
  • Мамыр 13, 2020, 7:30 Т.Ж.

да, спасибо)

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз