在详细视图中不能返回写入上下文

问题描述 投票:0回答:1
**post_detail.html**
  {{post.total_likes}}
  <form class="" action="{%url 'like_post' %}" method="post">
      {%csrf_token%}
    {% if is_liked %}
        <button type="submit" value="{{post.id}}" name="post_id" class="btn btn-danger">DisLike</button>
    {% else %}
        <button type="submit" value="{{post.id}}" name="post_id" class="btn btn-primary">Like</button>
    {% endif %}
    </form>

**views.py**

def like_post(request):
    post = get_object_or_404(Post,id=request.POST.get('post_id'))
    is_liked=False
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
        is_liked=False
    else:
        post.likes.add(request.user)
        is_liked=True
    return HttpResponseRedirect(post.get_absolute_url())

class PostDetailView(DetailView):
    model = Post
    fields = ['likes']

    def get_context_data(self,**kwargs):
        post = self.get_object()
        request = self.request
        post.is_liked = False
        if post.likes.filter(id=request.user.id).exists():
           post.is_liked = True
        context = super().get_context_data(**kwargs)
        context['total_likes','is_liked'] = [post.total_likes(),post.is_liked]
        return context


**urls.py**

from django.urls import path
from django.conf.urls import url
from .views import (
    PostListView,
    PostDetailView,
    PostCreateView,
    PostUpdateView,
    PostDeleteView,
    UserPostListView,
    SearchResultView
)
from . import views

urlpatterns = [
    path('', PostListView.as_view(), name='Blog-home'),
    path('search/', SearchResultView.as_view(), name='search-result'),
    path('user/<str:username>', UserPostListView.as_view(), name='user-posts'),
    path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
    path('post/new/', PostCreateView.as_view(), name='post-create'),
    path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
    path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),
    path('about/', views.about, name='Blog-about'),
    path('like/',views.like_post,name="like_post"),
]

**models.py**
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    ikes = models.ManyToManyField(User,related_name='likes',blank=True)

    def __str__(self):
        return self.title

    def total_likes(self):
        return self.likes.count()

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

这是我的代码。这是我的代码,没有任何错误,唯一的问题是喜欢按钮保持不变,即喜欢似乎总是假的。我的post_detail使用了基于类的视图,并在其中添加了get_context_data方法,但我认为这个方法没有用。所以我需要为PostDetailView写一段代码,其余的一切都很好,主要问题是PostDetailView返回的is_liked总是false。

我应该使用函数视图来代替吗?

python django detailsview
1个回答
0
投票

问题就出在这里。

context['total_likes','is_liked'] = [post.total_likes(),post.is_liked]

它实际上生成了一个这样的字典。

{('total_likes', 'is_liked'): [100, True]}

而不是像这样更新上下文

context.update({'total_likes': post.total_likes(), 'is_liked': post.is_liked})
return context
© www.soinside.com 2019 - 2024. All rights reserved.