Evgenii Legotckoi
Evgenii Legotckoi8. April 2017 07:52

Django - Tutorial 022. Hinzufügen eines Lesezeichensystems (Favoriten) zur Site

Die Seite fügte die Möglichkeit hinzu, Artikel, Kommentare, Themen und Antworten im Forum als Favoriten zu markieren. Gleichzeitig erfordert das Markieren als Favorit kein erneutes Laden der Seite, da diese Aktionen den AJAX-Request-Mechanismus verwenden.

Um das Lesezeichensystem zu implementieren, müssen Sie:

  • Fügen Sie eine Tabelle hinzu, die eine Viele-zu-Viele-Beziehung zwischen einem Benutzer und einem Artikel oder Kommentar implementiert.
  • Fügen Sie eine Ansicht hinzu, die diese Anfrage verarbeitet.
  • Fügen Sie eine URL hinzu, um eine Anfrage zum Hinzufügen oder Ausschließen eines Objekts aus den Favoriten zu verarbeiten.
  • Schreiben Sie HTML-Code, der für die Anzeige des den Lesezeichen hinzugefügten Zählers verantwortlich ist.
  • Fügen Sie einen Javascript-Handler hinzu, der eine AJAX-Anfrage stellt.

Auf dieser Seite wird das Stern-Icon von Bootstrap als Zähler-Icon verwendet.


Many-to-Many-Tabelle für Lesezeichen

Lassen Sie uns das Hinzufügen von Lesezeichen für Artikel und Kommentare ermöglichen. Dazu erstellen wir ein allgemeines abstraktes Modell , von dem wir für eine bestimmte Art von Inhalten auf der Website erben. Im abstrakten Modell erstellen wir ein Benutzerfeld, das für alle Lesezeichenmodelle gleich ist.

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

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

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

Als nächstes erben wir von diesem Modell, um zwei separate Datenmodelle für Kommentare und Artikel zu erstellen.

Hier fügen wir das Feld obj hinzu, das für den Fremdschlüssel der Inhaltstabelle verantwortlich ist: Artikel oder Kommentar. Wichtig ist, dass das Feld in beiden Modellen gleich benannt wird. Dann ist es möglich, eine Ansicht für alle Lesezeichentabellen zu schreiben.

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="Комментарий")

views.py

Um eine Anfrage zum Hinzufügen zu Lesezeichen oder zum Entfernen aus Lesezeichen zu verarbeiten, erstellen wir eine Ansicht, die mit jeder Lesezeichentabelle arbeiten kann, die der oben dargestellten allgemeinen Ansicht entspricht.

# -*- 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"
        )

Beachten Sie, dass dieser Code den Vergleich obj_id=pk verwendet hat, was bedeutet, dass wir versuchen, einen Eintrag in der Lesezeichentabelle anhand der Objekt-ID zu finden. Da dieses Feld in allen Modellen gleich ist, sollte es mit dieser Syntax keine Probleme geben.

urls.py

Sehen wir uns nun an, wie die URLs für die Verarbeitung von Anfragen zum Hinzufügen von Inhalten zu Lesezeichen aussehen.

# -*- 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'),
]

Um diese Anfrage auszuführen, muss der Benutzer angemeldet sein, wofür der Dekorateur login_required verantwortlich ist.

Die URL definiert in diesem Fall, welche Art von Inhalt mit einem Lesezeichen versehen ist, sie definiert auch den pk dieses Inhalts und die durchzuführende Aktion. Tatsächlich können Sie nicht nur Lesezeichen hinzufügen, sondern auch ein System von Likes, Reposts usw. hinzufügen. nach dem gleichen Prinzip.

html

In meinem Fall sieht der HTML-Code so aus:

<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>

Hier gibt es mehrere benutzerdefinierte Attribute:

  • data-id - verantwortlich für pk-Inhalte, die mit einem Lesezeichen versehen werden können.
  • Datentyp - Inhaltstyp, derselbe Name erscheint in der URL.
  • data-action - die auszuführende Aktion, in diesem Fall Lesezeichen
  • data-count - Zähler, der anzeigt, wie viele Benutzer Inhalte mit Lesezeichen versehen haben

Der folgende Code like_obj.get_bookmark_count, ist ebenfalls eine einheitliche Methode, die dem Inhaltsmodell hinzugefügt wird, für Artikel sieht es beispielsweise so aus:

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

Javascript

AJAX-Anforderungen für diese Funktionalität werden mithilfe der jQuery -Bibliothek erstellt.

Bei der Arbeit mit AJAX sind einige Dinge zu beachten:

  1. Wenn Sie eine mehrsprachige Website haben, die URLs hat, die sich in der aktuellen Sprache unterscheiden, dann ist es besser, eine separate API für AJAX zu erstellen, die von der Sprache unabhängig ist, andernfalls müssen Sie die Sprache in der berücksichtigen URL beim Erstellen einer AJAX-Anfrage. Wenn die Sprache nicht berücksichtigt wird, wird die AJAX-Anfrage unter Berücksichtigung der Sprache auf die aktuelle URL umgeleitet und die Anfrage funktioniert nicht. Das heißt, es sollte keine Umleitungen geben.
  2. Django akzeptiert keine AJAX-Anforderungen, es sei denn, es ist für die Verwendung eines CSRF-Tokens konfiguriert, das zur Bekämpfung von standortübergreifender Anforderungsfälschung verwendet wird. Bei jedem Seitenaufruf mischt Django das CSRF-Token in Cookies, von dort kann es entnommen werden.

Konfigurieren von AJAX für die Verwendung eines CSRF-Tokens

Der folgende Code kann in ein Skript auf jeder Seite der Website eingefügt werden, auf der AJAX verwendet werden muss. AJAX wird automatisch für die Verwendung des CSRF-Tokens konfiguriert.

// Получение переменной 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") }
    });
});

Lesezeichen-Handler und ihre Verbindung

Der folgende Code generiert eine AJAX-Anforderung zum Aufrufen von Inhalten aus Lesezeichen hinzufügen oder entfernen. In diesem Fall ist der Code sowohl für Artikel als auch für Kommentare universell.

In der Anfrage-URL sehen Sie die folgende Zeile "/api/" + type + "/" + pk + "/" + action + "/", was bedeutet, dass das Modul für AJAX-Anfragen an der hängt Präfix /api / , das heißt, es ist mit dieser URL in der Hauptprojektdatei urls.py verbunden, gefolgt vom Inhaltstyp, seinem Primärschlüssel und der auszuführenden Aktion. Da all diese Daten aus den Attributen data, stammen, sieht die endgültige URL so aus:

  • /api/article/112/bookmark/ - für Artikel
  • /api/comment/14/bookmark/ - für Kommentare

Im Erfolgshandler können Sie die Hervorhebung des Lesezeichensterns für den aktuellen Benutzer usw. hinzufügen.

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);
});

Für Django empfehle ich Timeweb-Hoster VDS-Server .

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

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

ИМ
  • 1. Dezember 2018 17:57

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

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

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

self.bookmarkarticle_set()

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

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

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

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

Вообще это стандартное поведение в моделях, если на данную модель какая-то иная модель имеет внешний ключ (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>

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'

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







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

movie.bookmarks.all

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

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

movie.bookmarkmovie_set.all

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

ИМ
  • 3. Dezember 2018 13:10

Все верно.

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

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

self.bookmarkmovie_set.all().count()

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












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

{% if movie.bookmarkmovie_set.all|user_in:user %}fa-2x{% endif %}

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

ИМ
  • 5. Dezember 2018 04:44

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

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

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

user.bookmarkmovie_set.all()



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

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

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

{% 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. Dezember 2018 05:30

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

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

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

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

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

ab
  • 26. Oktober 2019 02:02

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

ab
  • 26. Oktober 2019 02:02

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

Evgenii Legotckoi
  • 26. Oktober 2019 13:58

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

progammist
  • 29. April 2020 07:37

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

#app_name = 'ajax'

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

Evgenii Legotckoi
  • 29. April 2020 07:46

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

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

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

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

Evgenii Legotckoi
  • 29. April 2020 07:51

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

progammist
  • 29. April 2020 08:01
  • (bearbeitet)

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

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

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

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

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

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

Evgenii Legotckoi
  • 29. April 2020 08:08

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

progammist
  • 29. April 2020 13:34

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

progammist
  • 30. April 2020 06:52

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

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

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

Evgenii Legotckoi
  • 30. April 2020 07:00
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. April 2020 07:23
  • (bearbeitet)

Вообщем решил сделать не по 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. April 2020 07:29
  • (bearbeitet)

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

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

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

progammist
  • 30. April 2020 19:17
  • (bearbeitet)

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

Evgenii Legotckoi
  • 3. Mai 2020 17:22

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

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

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

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

progammist
  • 3. Mai 2020 20:19
  • (bearbeitet)

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

 "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. Mai 2020 02:54

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

progammist
  • 4. Mai 2020 03:05

нет, а как?)

Evgenii Legotckoi
  • 4. Mai 2020 03:25

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

progammist
  • 4. Mai 2020 03:36
  • (bearbeitet)

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

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

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

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

Evgenii Legotckoi
  • 4. Mai 2020 03:47
  • (bearbeitet)

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

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

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

progammist
  • 7. Mai 2020 16:04

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

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

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

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

Evgenii Legotckoi
  • 8. Mai 2020 10:12

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

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

progammist
  • 9. Mai 2020 12:19

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

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

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

progammist
  • 10. Mai 2020 09:01

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

progammist
  • 10. Mai 2020 09:23

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

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

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

{{ bookmark.obj.title }} 
progammist
  • 13. Mai 2020 07:20
  • (bearbeitet)

Как я могу вывести добавленные посты в обратном порядке? сейчас выводятся новодобавленные в конец. Пыатюсь добавить 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. Mai 2020 07:24

Может так?

object_list =  User.bookmarkarticle_set.all().order_by('-obj__created_on')
progammist
  • 13. Mai 2020 07:30

да, спасибо)

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken