2017-10-03 3 views
0

私のテンプレートには、ユーザーが投稿したかどうかによって異なるボタンを表示するためのif文があります。同じトリガーリンク、URL、およびビューがありますが、ユーザーがその投稿を好きだったかどうかによって、テキストに「好き」または「違う」と表示されます。しかし、それは動作していません、エラー、ないだけで動作しません。投稿ごとに異なるテキストが表示される

好きなものはUserPostモデルのManyToManyFieldです。

テンプレート:

{% 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() 

モデル:あなたがフラットなリストとして同類をエクスポートUserPostモデルに機能を追加することができ

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

あなたはrequest.user.usernameをチェックしましたか?post.likesにはあなたが持っていると思う値がありますか? – ifnotX

+0

ええ、彼らが言うことができる限り。私はサイトにログインしていて、投稿が気に入っていて、管理者で私のユーザー名がその投稿を好きなようにリストされていることがわかります。 – Garrett

+0

それはテンプレートにも渡されていますか? views.pyからビューを投稿する必要があります。また、post.likes.countはOKから来ていますか? – ifnotX

答えて

1

このように:

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

EDIT:

それはおそらくより効率的ですユーザーが気に入った投稿のフラットリストを作成し、テンプレート引数として渡し、投稿IDがそのリストに含まれているかどうかを確認します。上記のコードはすべての投稿のためのフラットリストを作成します。

+0

私はそれを打つつもりです。 「フラット」とは何ですか? – Garrett

+0

https://docs.djangoproject.com/en/1.11/ref/models/querysets/#values-list – spin

+0

をご覧ください。うまくいきました。ありがとうございました!好奇心の理由から、なぜ 'user_id'の代わりに' id'にする必要がありましたか? – Garrett

関連する問題