2017-10-03 2 views
0

J'ai cette instruction if dans mon modèle pour afficher différents boutons selon si un utilisateur a eu un message. Il existe le même lien de déclenchement, l'URL et la vue, mais le texte dit "J'aime" ou "Contrairement" selon que l'utilisateur a déjà aimé ce post ou non. Cependant, cela ne fonctionne pas, aucune erreur, ne fonctionne pas. Aime est un ManyToManyField dans le modèle UserPost.texte différent selon si l'utilisateur a aimé un article

Modèle:

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

Modèle:

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

Avez-vous vérifié request.user.username et post.likes ont les valeurs que vous pensez avoir? – ifnotX

+0

ouais pour autant que je peux dire qu'ils le font. Je suis connecté sur le site et j'ai aimé un post, et dans l'admin je peux voir que mon nom d'utilisateur est répertorié comme aimant ce poste. – Garrett

+0

Est-ce que cela est passé au modèle cependant? Vous devriez publier la vue depuis views.py. En outre, post.likes.count est-il correct? – ifnotX

Répondre

1

Vous pouvez ajouter une fonction au modèle UserPost qui exporte l'aime comme une liste plate , comme ceci:

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

Vous n'êtes pas sûr du code exact requis, puisque vous n'avez pas posté votre modèle.

Vous devriez alors être en mesure de faire quelque chose comme ça dans votre modèle (encore une fois, peut-être légèrement différente en fonction de vos modèles):

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

EDIT:

Il est probablement plus efficace créer une liste plate de messages que l'utilisateur a aimés et les transmettre en tant qu'argument de modèle, et vérifier si l'identifiant de publication est contenu dans cette liste. Le code ci-dessus crée une telle liste plate pour chaque publication.

+0

Je vais essayer. Que fait 'flat'? – Garrett

+0

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

+0

Cela a fonctionné, merci! Juste par curiosité, pourquoi avait-il besoin d'être "id" au lieu de "user_id"? – Garrett