“喜欢”按钮,我不断得到:与“喜欢”相反,未找到任何参数。尝试了1种模式:[“产品/(P<slug>[azazoz09+)$”]

2024-06-08 22:16:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我用JSON代码在Django中创建了一个like按钮,但我一直得到“NoReverseMatch”。在url.py和models.py中,我显示了所有的代码,在views.py中,仅显示like按钮和导入的方法,在detail.html中,仅显示like按钮和JSON脚本的html标记。 这就是我在浏览器中看到的:

Reverse for 'like' with no arguments not found. 1 pattern(s) tried: ['products/(?P<slug>[-a-zA-Z0-9_]+)$']
    Request Method: GET
    Request URL:    http://localhost:8000/products/7/
    Django Version: 2.2.9
    Exception Type: NoReverseMatch
    Exception Value:    
    Reverse for 'like' with no arguments not found. 1 pattern(s) tried: ['products/(?P<slug>[-a-zA-Z0-9_]+)$']

Python Version: 3.7.4

应用程序“产品”中的models.py:

from django.db import models
from django.contrib.auth.models import User
from django.template.defaultfilters import slugify
from django.urls import reverse

class Product(models.Model):
    title = models.CharField(max_length = 80)
    pub_date =  models.DateTimeField()
    body = models.TextField()
    url = models.TextField()
    image = models.ImageField(upload_to = 'images/')
    icon = models.ImageField(upload_to = 'icon/')
    votes_total = models.IntegerField(default=1)
    slug = models.SlugField(null=False, unique=True)
    likes = models.ManyToManyField(User, blank=True, related_name='likes')
    hunter = models.ForeignKey(User, on_delete = models.CASCADE)

    def __str__(self):
        return self.title
    def summary(self):
        return self.body[:100] + "..."
    def pub_date_pretty(self):
        return self.pub_date.strftime("%b %e %Y")

    def save(self, *args, **kwargs):
         #if not self.slug:
            #self.slug = slugify(self.title)

        if not self.slug:
            slug = slugify(self.title)
            while True:
                try:
                    product = Product.objects.get(slug=slug)
                    if article == self:
                        self.slug = slug
                        break
                    else:
                        slug = slug + '-'
                except:
                    self.slug = slug
                    break
        return super(Product, self).save(*args, **kwargs)
    @property
    def total_likes(self):
        return self.likes.count()

应用程序“产品”中的views.py:

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import Product
from django.contrib.auth.models import User
from django.utils import timezone
from django.views.decorators.http import require_POST
from django.http import HttpResponse
try:
    from django.utils import simplejson as json
except ImportError:
    import json

  .
  .
  .
@login_required(login_url = '/accounts/signup')
@require_POST
def like(request, slug):
    if request.method == 'POST':
        hunter = request.user
        #slug = request.POST.get('slug', None)
        product = get_object_or_404(Product, slug = slug)

        if product.likes.filter(hunter_id = hunter.id).exists():
            product.likes.remove(hunter)
            message = 'You disliked this'
            product.save()
        else:
            product.likes.add(hunter)
            message = 'You liked this'
            product.save()

    ctx = {'likes_count': product.total_likes, 'message': message}
    return HttpResponse(json.dumps(ctx), content_type='application/json')

产品应用程序中的URL.py:

from django.urls import path, include
from . import views

urlpatterns = [
    path('create', views.create, name = 'create'),
    path('<int:product_id>/', views.detail, name = 'detail'),
    path('<int:product_id>/upvote', views.upvote, name = 'upvote'),
    path('user/<int:fk>', views.hunterhunts, name = 'hunterhunts'),
    path('<slug:slug>', views.like, name='like'),
]

“产品”应用程序中的HTML文件detail.HTML:

<input type="button" id="like" name="{{ product.slug }}" value="Like" />
                    <script>
                    $('#like').click(function() {
                      $.ajax({
                        type: "POST",
                        url: "{% url 'like' %}",
                        data: {
                          'slug': $(this).attr('name'),
                          'csrfmiddlewaretoken': '{{ csrf_token }}'
                        },
                        dataType: "json",
                        success: function(response) {
                          alert(response.message);
                          alert('Product likes count is now ' + response.likes_count);
                        },
                        error: function(rs, e) {
                          alert(rs.responseText);
                        }
                      });
                    });
                  </script>

对于类似的按钮工作,是否知道应该更正或添加什么

如果可以,请明确说明


Tags: djangonamefrompyimportselfmodelsdef