Home > Enterprise >  I want to add like unlike feature to my blog site, everythin is okay there, like and unlike objects
I want to add like unlike feature to my blog site, everythin is okay there, like and unlike objects

Time:10-25

I want to add like unlike feature to my blog site, everythin is okay there, like and unlike objects are being created.. But I'm getting NoReverseMatch when I'm clicking the Like and Unlike..and the problem is I can't figure it out why I'm getting this...my models.py, views.py, urls.py, blog_page.html...all are attatched here.. plz try help me solve this

**models.py**
from email.policy import default
from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Blog(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200, verbose_name="Put a Title")
    blog_content = models.TextField(verbose_name="What is on your mind")
    blog_image = models.ImageField(upload_to="blog_images", default = "/default.png")
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

class Comment(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name = "blog_comment" )
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name = "user_comment")
    comment = models.TextField()
    comment_date = models.DateField(auto_now_add=True)


    def __str__(self):
        return self.comment


class Like(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name = "blog_liked")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name = "user_liked")


class Unlike(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name = "blog_unliked")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name = "user_unliked")


**views.py**


from django.shortcuts import render
from . models import Blog, Comment, Like, Unlike

# Create your views here.
def home(request):
    blogs = Blog.objects.all()
    

    context = {'blogs': blogs}
    return render(request, 'blog_app/home.html', context)





def blog_view(request, pk):
    blog = Blog.objects.get(id=pk)
    context = {"blog": blog}
    return render(request, 'blog_app/blog_page.html', context)
    
def like(request, pk):
    blog = Blog.objects.get(id=pk)
    user = request.user
    liked, like = Like.objects.get_or_create(blog=blog, user=user)
    context = {"liked" : liked}
    return render(request, "blog_app/blog_page.html", context)

def unlike(request, pk):
    blog = Blog.objects.get(id=pk)
    user = request.user
    unliked, unlike = Unlike.objects.get_or_create(blog=blog, user=user)
    context = {"unliked" : unliked}
    return render(request, "blog_app/blog_page.html", context)


**urls.py**

from django.urls import path
from blog_app import views 

urlpatterns = [
    path("", views.home, name='home'),
    path("blog_page/<str:pk>/", views.blog_view, name='blog_page'),
    path("like/<str:pk>/", views.like, name="like"),
    path("unlike/<str:pk>/", views.unlike, name="unlike"),
]


**blog_page.html**
{% extends "main.html" %}
{% load static %}
{% block content %}

<div style="text-align:center;">
    <h2>{{blog.title}}</h2>
    <img src="{{blog.blog_image.url}}" alt="" width="630px" height="300px">
</div>
<div style="text-align:center;">
    {{blog.blog_content|linebreaks}}
</div>
{% if liked %}
<h4><a  href="{% url 'unlike' blog.id %}">Unlike</a></h4>
{% else %}
<h4> <a href="{% url 'like' blog.id %}">Like</a> </h4>
{% endif %}


{% endblock content %}

CodePudding user response:

Your URLs are expecting a string value for blog_id but you are passing them an int in {% url 'unlike' blog.id %} Try changing your URL file to expect an int, and you should be able to look it up more successfully.

path("blog_page/<int:pk>/", views.blog_view, name='blog_page'),
path("like/<int:pk>/", views.like, name="like"),
path("unlike/<int:pk>/", views.unlike, name="unlike"),

Also, as you are using the same page template for the like and unlike view, you will need to pass the blog element in the context again to make links work on those pages, eg,

context = {"liked" : liked, "blog", blog}
  • Related