不同的文字取决于用户是否喜欢帖子

时间:2017-10-03 23:12:36

标签: python django jinja2

我的模板中有if语句,根据用户是否喜欢帖子显示不同的按钮。有相同的触发链接,网址和视图,但文字要么说"喜欢"或"与"不同。取决于用户之前是否喜欢该帖子。然而,它没有工作,没有错误,只是没有工作。

喜欢是ManyToManyField模型中的UserPost

模板:

{% for post in posts %}
    <div class="single-post">
        <div class="post-header">
            <a class="link inline-block" href="{% url 'feed:post_detail' post.id %}">
                <h2 class="post-title">{{ post.title }}</h2>
            </a>

            <div class="post-interaction">
                {% if request.user.username in post.likes %}
                    <a class="link right-margin" href="{% url 'feed:post_like' post.id %}">
                        Unlike: {{ post.likes.count }}
                    </a>
                {% else %}
                    <a class="link right-margin" href="{% url 'feed:post_like' post.id %}">
                        Like: {{ post.likes.count }}
                    </a>
                {% endif %}
                <a class="link right-margin" href="{% url 'feed:post_detail' post.id %}">
                    Comments: {{ post.comments.count }}
                </a>
            </div>
        </div>

        {% if post.image %}
            <img class="post-pic" src="{{ post.image.url }}">
        {% endif %}

        <p class="post-body more-top-margin">{{ post.post_body }}</p>

        <div class="divider"></div>

        <p class="message-hint post-meta">{{ post.author }}</p>
        <p class="message-hint post-meta">{{ post.post_date }}</p>
        {% if request.user.is_authenticated and request.user == post.author or request.user.userprofile.user_level == 'admin' or request.user.userprofile.user_level == 'moderator' %}
            <a class="link right-margin" href="{% url 'feed:edit_post' post.id %}">
                Edit Post
            </a>
            <a class="link right-margin" href="{% url 'feed:delete_post' post.id %}">
                Delete Post
            </a>
        {% endif %}
    </div>
{% endfor %}

Views.py:

class HomeView(LoginRequiredMixin,ListView):
    login_url = 'account_login'
    model = UserPost
    template_name = 'feed/userpost_list.html'
    context_object_name = 'posts'
    paginate_by = 25
    queryset = UserPost.objects.all()

型号:

class UserPost(models.Model):
    author = models.ForeignKey(User,related_name='userpost',null=True)
    post_date = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=150,blank=False)
    post_body = models.TextField(max_length=1000,blank=False)
    image = models.ImageField(upload_to='post_pics',blank=True)
    likes = models.ManyToManyField(User,blank=True,related_name='post_likes')

    class Meta:
        ordering = ['-post_date']

    def publish(self):
        self.save()

    def get_absolute_url(self):
        return reverse('index')

    def likes_as_flat_user_id_list(self):
        return self.likes.values_list('user_id', flat=True)

    def __str__(self):
        return self.title

1 个答案:

答案 0 :(得分:1)

您可以向UserPost模型添加一个函数,将其作为平面列表导出,如下所示:

def likes_as_flat_user_id_list(self):
  return self.likes.values_list('id', flat=True)

不确定所需的确切代码,因为您尚未发布模型。

然后,您应该可以在模板中执行此类操作(同样,根据您的型号可能略有不同):

{% if request.user.id in post.likes_as_flat_user_id_list %}

编辑:

创建用户喜欢的帖子的平面列表并将其作为模板参数传递可能更有效,并检查帖子ID是否包含在该列表中。上面的代码为每个帖子创建了这样一个平面列表。