如何使用基于 Django 通用 class 的视图添加最喜欢的文章标记系统?
How can I add a favorite article marking system with django generic class-based view?
我正在尝试让我的用户标记最喜欢的帖子,以便他们以后可以阅读。
我看过一些使用 FBV 的解决方案,但我想用 CBV 制作最喜欢的标记。
如何使用基于 django class 的视图 (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)
网址
urlpatterns = [
path('<int:pk>/edit/', ArticleUpdateView.as_view(), name='article_update'),
path('<int:pk>/favorite_post/', favorite_post, name='favorite_post'),
]
您可以尝试使用 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'),
]
这对你有用吗?
我正在尝试让我的用户标记最喜欢的帖子,以便他们以后可以阅读。 我看过一些使用 FBV 的解决方案,但我想用 CBV 制作最喜欢的标记。
如何使用基于 django class 的视图 (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)
网址
urlpatterns = [
path('<int:pk>/edit/', ArticleUpdateView.as_view(), name='article_update'),
path('<int:pk>/favorite_post/', favorite_post, name='favorite_post'),
]
您可以尝试使用 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'),
]
这对你有用吗?