我用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>
对于类似的按钮工作,是否知道应该更正或添加什么
如果可以,请明确说明
您需要将
slug
作为参数传递到url: "{% url 'like' %}",
像这样:
url: "{% url 'like' product.slug %}",
相关问题 更多 >
编程相关推荐