首页 > 解决方案 > Django 错误 - /listings/1 处的 NoReverseMatch。未找到带有参数“(”,)“的“添加评论”的反向操作。(创建评论部分)

问题描述

我是 Django 新手,我认为我在设置动态 url 时遇到了问题。我正在创建一种向页面添加评论的方法,称为列表。在我添加任何有关评论的内容之前,列表页面加载良好。当我尝试转到该特定列表时,我收到错误消息:

“/listings/1 处的 NoReverseMatch。未找到带有参数 '('',)' 的 'addcomment' 的反向。尝试了 1 种模式:['addcomment/(?P[0-9]+)$']”

感谢您提供任何帮助,因为即使在查看文档之后,我也无法理解动态 url 如何工作/如何创建它们。我认为我的 html 页面也可能存在问题,例如使用 url 提取正确信息等。

视图.py

def addcomment(request, id):
    obj = Comments()
    obj.comment = request.POST.get("comment")
    obj.user = request.user.username
    obj.listingid = id
    obj.save()

    # returning the updated content
    print("displaying comments")
    comments = Comments.objects.filter(listingid=id)
    product = Listings.objects.filter(id=id)
    return render(request, "auctions/listing.html", {
        "product": product,
        "comments": comments
    })

def listingpage(request, id):
    comments = Comments.objects.get(listingid=id)
    item = Listings.objects.get(id=id)
    return render(request, "auctions/listing.html", {
        "i": item,
        "id": id,
        "comments": comments,
        })

网址.py

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("auctions/create", views.create, name="create"),
    path("listings/<int:id>", views.listingpage, name="listingpage"),
    path("addcomment/<int:id>", views.addcomment, name="addcomment"),
]

模型.py

class Listings(models.Model):
    title = models.CharField(max_length=64)
    description = models.TextField(max_length=250)
    starting_bid = models.IntegerField()
    link = models.CharField(max_length=100, default=None, blank=True, 
    null=True)


class Comments(models.Model):
    comment = models.CharField(max_length=250, default='')
    user = models.CharField(max_length=64)
    listingid = models.IntegerField()

添加评论的列表页面的 HTML 文件的一部分:

<h2 class="card-title h2">ADD COMMENT</h2>

            <form action="{% url 'addcomment' product.id %}" 
method="POST">
                {% csrf_token %}
                <div class="form-group">
                    <textarea class="form-control" name="comment" 
rows="4" placeholder="Your Comment"></textarea>
                </div>
                <p align="justify"><input class="btn btn-primary" type="submit" value="Submit"></p>
            </form>
        </div>

{% endblock %}

标签: djangodjango-modelsdjango-viewsdjango-formsdjango-templates

解决方案


问题是您没有将具有名称的变量传递productlisting.html模板,只有i,idcomments. 因此,您应该将其作为产品传递:

def listingpage(request, id):
    comments = Comments.objects.get(listingid=id)
    item = Listings.objects.get(id=id)
    return render(request, 'auctions/listing.html', {
        'i': item,
        'id': id,
        'product': item,  # ← pass product
        'comments': comments,
    })

推荐阅读