Hi,

We can't solve all of your problems for you :) But that being said - in the
get_context_data you don't have a parameter for the request, however in all
CBV you get the request as a variable on the CBV itself - so change:

post.is_liked = post.likes.filter(user=request.user).exists()

To:


post.is_liked = post.likes.filter(user=self.request.user).exists()

Regards,

Andréas


Den ons 13 maj 2020 kl 22:10 skrev Ahmed Khairy <[email protected]
>:

> still showing the same error
>
> On Wednesday, May 13, 2020 at 2:34:03 PM UTC-4, Yamen Gamal Eldin wrote:
>>
>> I haven't seen any definition for user within ur function, so
>> Change this
>> post.is_liked = post.likes.filter(user=user).exists()
>>
>> To this
>>
>> post.is_liked = post.likes.filter(user=request.user).exists()
>>
>>
>> Le mer. 13 mai 2020 à 19:22, Ahmed Khairy <[email protected]> a
>> écrit :
>>
>>> Hi There,
>>>
>>> I have rewritten the get_context_data method to be like this but I am
>>> getting name 'user' is not defined:
>>>
>>>
>>> class PostListView(ListView):
>>>     model = Post
>>>     template_name = "score.html"
>>>     ordering = ['-date_posted']
>>>     context_object_name = 'posts'
>>>     paginate_by = 5
>>>
>>>     def get_context_data(self, **kwargs):
>>>         context_data = super(PostListView, self).get_context_data(**
>>> kwargs)
>>>         for post in context_data['posts']:
>>>             post.is_liked = post.likes.filter(user=user).exists()
>>> <----- name 'user' is not defined
>>>         return context
>>>
>>> I am also using this template just for testing till fix the issue
>>>
>>> Thank you Andreas with me
>>>
>>>
>>> On Wednesday, May 13, 2020 at 12:31:15 PM UTC-4, Andréas Kühne wrote:
>>>>
>>>> Hi again,
>>>>
>>>> Bare with me - this is just written in this email - so:
>>>>
>>>> 1. Your listview is paginated by 5, so it will only show 5 posts -
>>>> that's good for this exercise and how I would solve it.
>>>> 2. Rewrite your get_context_data method to iterate over the posts:
>>>>     def get_context_data(self, **kwargs):
>>>>         context_data = super(PostListView,
>>>> self).get_context_data(**kwargs)
>>>>         for post in context_data['posts']:
>>>>             post.is_liked = post.likes.filter(user=user).exists()
>>>>         return context
>>>>
>>>> So now your page should show. In the page template:
>>>>
>>>> % extends "base.html"%} {% block content %} {% for post in posts %}
>>>> <div style="padding-top: 200 px;"><strong>{{post.title}}</strong></div>
>>>> <form action="{% url 'score:like_post'%}" method="POST" class="ui form">
>>>>   <input type="hidden" name="post_id" value="{{post.id}}" />{% csrf_token 
>>>> %} {% if is_like %}   <button class="ui button positive" 
>>>> type="submit">Unlike</button>
>>>>
>>>>   {% else %}
>>>>   <button class="ui button negative" type="submit">Like</button>
>>>>   {% endif %}</form>{% endfor %} {% endblock content %}
>>>>
>>>> Something like this should give you the functionality you want -
>>>> however it's still a bit cumbersome.
>>>>
>>>> Regards,
>>>>
>>>> Andréas
>>>>
>>>>
>>>> Den ons 13 maj 2020 kl 15:24 skrev Ahmed Khairy <[email protected]
>>>> >:
>>>>
>>>>> Hi Andréas Kühne,
>>>>>
>>>>> Regarding the first error
>>>>>
>>>>> I have a list of posts in the listView and want to add the like button
>>>>> to each post so how should I fix it?
>>>>>
>>>>> Thank you
>>>>>
>>>>> On Wednesday, May 13, 2020 at 6:08:31 AM UTC-4, Andréas Kühne wrote:
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> There are a couple of errors in your code:
>>>>>>
>>>>>> 1. You are using a ListView and then trying to get an individual
>>>>>> post? That is really strange
>>>>>> 2. In your get_context_data method - you first get the context data,
>>>>>> update it and then you set it to a new dict, so everything is reset in 
>>>>>> the
>>>>>> dict.
>>>>>> 3. you are trying to get the absolut url for your post, but aren't
>>>>>> showing any post detail view.
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>> Andréas
>>>>>>
>>>>>>
>>>>>> Den ons 13 maj 2020 kl 06:46 skrev Ahmed Khairy <
>>>>>> [email protected]>:
>>>>>>
>>>>>>> I am currently trying to create a like button for my posts in Django
>>>>>>>
>>>>>>> I have reached to the part where I can add a like but I am facing
>>>>>>> difficulty writing the code related to the view which linking the
>>>>>>> PostListView if there is user who liked it or not. I am getting an 
>>>>>>> error:
>>>>>>> page Error 404 although everything is correct
>>>>>>>
>>>>>>>
>>>>>>> this the views:
>>>>>>>
>>>>>>>
>>>>>>> class PostListView(ListView):
>>>>>>>     model = Post
>>>>>>>     template_name = "score.html"
>>>>>>>     ordering = ['-date_posted']
>>>>>>>     context_object_name = 'posts'
>>>>>>>     queryset = Post.objects.filter(admin_approved=True)
>>>>>>>     paginate_by = 5
>>>>>>>
>>>>>>>     def get_context_data(self, **kwargs):
>>>>>>>         post = get_object_or_404(Post, id=self.request.POST.get(
>>>>>>> 'post_id'))
>>>>>>>         context = super(PostListView, self).get_context_data(**
>>>>>>> kwargs)
>>>>>>>         context['posts'][0].likes.filter(id=self.request.user.id).
>>>>>>> exists()
>>>>>>>         is_liked = False
>>>>>>>         if post.likes.filter(id=self.request.user.id).exists():
>>>>>>>             is_liked = True
>>>>>>>         context = {'post': post,
>>>>>>>                    'is_like': is_liked,
>>>>>>>                    }
>>>>>>>         return context
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> 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():
>>>>>>>         posts.likes.remove(request.user)
>>>>>>>         is_liked = False
>>>>>>>
>>>>>>>     else:
>>>>>>>         post.likes.add(request.user)
>>>>>>>         is_liked = True
>>>>>>>
>>>>>>>     return HttpResponseRedirect(post.get_absolute_url())
>>>>>>>
>>>>>>>
>>>>>>> This is the model
>>>>>>>
>>>>>>>
>>>>>>> class Post(models.Model):
>>>>>>>     designer = models.ForeignKey(User, on_delete=models.CASCADE)
>>>>>>>     title = models.CharField(max_length=100)
>>>>>>>     date_posted = models.DateTimeField(default=timezone.now)
>>>>>>>     likes = models.ManyToManyField(User, blank=True, 
>>>>>>> related_name='likes')
>>>>>>>
>>>>>>>     def __str__(self):
>>>>>>>         return self.title
>>>>>>>
>>>>>>> Here is the
>>>>>>>
>>>>>>> path('like/', like_post, name='like_post'),
>>>>>>>
>>>>>>> here is the template:
>>>>>>>
>>>>>>> {% extends "base.html"%} {% block content %} {% for post in posts %}
>>>>>>> <div style="padding-top: 200 px;"><strong>{{post.title}}</strong></div>
>>>>>>> <form action="{% url 'score:like_post'%}" method="POST" class="ui form">
>>>>>>>   {% csrf_token %} {% if is_like %}
>>>>>>>   <input type="hidden" name="post_id" value="{{post.id}}" />
>>>>>>>   <button class="ui button positive" type="submit">Unlike</button>
>>>>>>>   {% else %}
>>>>>>>   <button class="ui button negative" type="submit">Like</button>
>>>>>>>   {% endif %}</form><strong>Likes </strong>
>>>>>>>
>>>>>>> {% endfor %} {% endblock content %}
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "Django users" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>> send an email to [email protected].
>>>>>>> To view this discussion on the web visit
>>>>>>> https://groups.google.com/d/msgid/django-users/583492d8-5252-4f86-8e8f-7593b582d404%40googlegroups.com
>>>>>>> <https://groups.google.com/d/msgid/django-users/583492d8-5252-4f86-8e8f-7593b582d404%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Django users" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to [email protected].
>>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/django-users/aee352a1-2938-42a6-98cb-5d602abba567%40googlegroups.com
>>>>> <https://groups.google.com/d/msgid/django-users/aee352a1-2938-42a6-98cb-5d602abba567%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Django users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/django-users/58be585f-357c-4454-acad-6799abe2e43d%40googlegroups.com
>>> <https://groups.google.com/d/msgid/django-users/58be585f-357c-4454-acad-6799abe2e43d%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/d65b8dcb-b7e3-472d-8892-fb4c8e477109%40googlegroups.com
> <https://groups.google.com/d/msgid/django-users/d65b8dcb-b7e3-472d-8892-fb4c8e477109%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CAK4qSCfWEg6y2DwknzwM4B_m6140j%2Bg1G0GQcLV0vSjRKyvUmA%40mail.gmail.com.

Reply via email to