Как я могу добавить любимую систему маркировки статей с помощью общего представления на основе классов django? - PullRequest
1 голос
/ 29 июня 2019

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

Как я могу сделать это, используя представление на основе классов django (DetailView)?

модель

class Article(models.Model):
    ...
    favorite = models.ManyToManyField(get_user_model(),  related_name='favorite', blank=True)

    def get_absolute_url(self):
        return reverse('article_detail', args=[str(self.id)])

просмотров

class ArticleDetailView(ObjectViewMixin, DetailView):
    model = Article
    context_object_name = 'article'
    ...
    def get_context_data(self, **kwargs):
        ...
        return context


def favorite_post(request, id):
    post = get_object_or_404(Article, id=id)
    if post.favorite.filter(id=request.user.id).exists():
        post.favorite.remove(request.user)
    else:
        post.favorite.add(request.user)
    return redirect('article_detail', pk=article.pk)

URL

urlpatterns = [
    path('<int:pk>/edit/', ArticleUpdateView.as_view(), name='article_update'),
    path('<int:pk>/favorite_post/', favorite_post, name='favorite_post'),
]

1 Ответ

1 голос
/ 29 июня 2019

Вы можете попробовать использовать UpdateView и переопределить его post() метод;Вы можете использовать его .get_object() метод для получения текущего Article экземпляра.

views.py

from django.views.generic import UpdateView
from .models import Article

class MyUpdateView(UpdateView):
    http_method_names = ['post', ]
    model = Article

    def post(self, *args, **kwargs):
        self.object = self.get_object()

        if self.object.favorite.filter(id=request.user.id).exists():
            self.object.favorite.remove(request.user)
        else:
            self.object.favorite.add(request.user)

        return redirect('article_detail', pk=self.object.pk)

urls.py

urlpatterns = [
    ...
    path('<int:pk>/favorite_post/', MyUpdateView.as_view(), name='favorite_post'),
]

Это работает для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...