【问题标题】:Reverse for 'add_review' with arguments '('',)' not found. 1 pattern(s) tried: ['addreview/(?P<id>[0-9]+)/$']未找到带有参数 '('',)' 的 'add_review' 的反向操作。尝试了 1 种模式:['addreview/(?P<id>[0-9]+)/$']
【发布时间】:2020-10-27 07:54:12
【问题描述】:

我在 django 中添加评论模型后出现错误...在管理页面模型上创建但在我的网站上它不起作用。我不知道我哪里出错了...请指导我

base.html 的第 28 行出现错误

它还在views.py第21行显示错误

views.py

from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import *
from .forms import *

# Create your views here.
def home(request):
   allbooks= book.objects.all()
   context= {
      "books": allbooks,
      }
   return render(request,'main/index.html',context) #error line

def detail (request,id):
   bk=book.objects.filter(id=id)
   reviews=Review.objects.filter(book=id)   
   context ={
      "book":bk,
      "reviews":reviews
      }
   return render (request,'main/details.html',context)

def addBooks(request):
   if request.user.is_authenticated:
      if request.user.is_superuser:
         if request.method== "POST":
            form=BookForm (request.POST or None)

            if form.is_valid():
               data=form.save(commit=False)
               data.save()
               return redirect("main:home")
         else:
            form=BookForm()
         return render (request, 'main/addbooks.html',{"form":form,"controller":"Add Books"})
      else:
         return redirect("main:home")
   else:
      return redirect("accounts:login")


def editBooks(request,id):
   if request.user.is_authenticated:
      if request.user.is_superuser:
         bk=book.objects.get(id=id)
         if request.method== "POST":
            form=BookForm (request.POST or None,instance=bk)

            if form.is_valid():
               data=form.save(commit=False)
               data.save()
               return redirect("main:detail",id)
         else:
            form=BookForm(instance=bk)
         return render (request, 'main/addbooks.html',{"form":form,"controller":"Edit Books"})
      else:
         return redirect("main:home")
   else:
      return redirect("accounts:login")

def deleteBooks(request,id):
   if request.user.is_authenticated:
      if request.user.is_superuser:
         bk=book.objects.get(id=id)
         bk.delete()
         return redirect("main:home") 
      else:
         return redirect("main:home")
   else:
      return redirect("accounts:login")


def add_review(request,id):
   if request.user.is_authenticated:
      bk=book.objects.get(id=id)
      if request.method == "POST":
         form= ReviewForm(request.POST or None)
         if form.is_valid():
            data=form.save(commit=False)
            data.comment=request.POST["comment"]
            data.rating=request.POST["rating"]
            data.user=request.user
            data.book=bk
            data.save()
            return redirect("main:detail",id)
      else:
         form=ReviewForm()
      return render(request,'main/details.html',{"form":form}) 
   else:
      return redirect("accounts:login")

base.html

<div class="collapse navbar-collapse" id="navbarSupportedContent">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item active">
        <a class="nav-link" href="{%url 'main:home'%}">Home<span class="sr-only">(current)</span></a> <!--error line-->
      </li>
      {% if request.user.is_authenticated %}
      {% if request.user.is_superuser %}
      <li class="nav-item">
        <a class="nav-link" href="{% url 'main:add_books'%}">Add Books</a>
      </li>
       {% endif %}
       {% endif %}

details.html

 <div class="card">
        <div class="card-body">
        <h3 class="text-center">Reviews</h3>
        <form action="{%url 'main:add_review' book.id%}"method="POST">
        {% csrf_token %}
        <label for="comment">Review</label>
        <textarea name="comment" id="comment" cols="30" rows="5" class="form-control"></textarea>

        <label for="rating">Rating</label>
        <input type="text" name="rating" class="form-control">
        <br>
        <input type="submit" class="btn btn-danger" value="Add Review">
        </form>
        </div>
    </div>
     <div class="card">
        <div class="card-body">
        <ul>
        {% for review in reviews  %}
            <li>{{review.comment}} <i>{{review.user}}</i></li>
        {% endfor %}
        </ul>
        </div>
    </div>

models.py

class Review(models.Model):
    book=models.ForeignKey(book,on_delete=models.CASCADE)
    user=models.ForeignKey(User,on_delete=models.CASCADE)
    comment=models.TextField(max_length=10000)
    rating=models.FloatField(default=0)

    def __str__(self):
        return self.user.username 

【问题讨论】:

  • 在 Python 和 Django 中,您通常将模型命名为 Book,并使用 book 表示单个 book。我建议您将模型重命名为 Book,因为 book.objects.all() 看起来会让其他 Django 用户感到困惑。

标签: python html django django-models django-views


【解决方案1】:

问题出在这里:

def detail(request,id):
    bk=book.objects.filter(id=id)

filter() 将返回书​​籍的查询集。你想获取真正的书,所以请改用get()

def detail(request,id):
    bk=book.objects.get(id=id)

这应该可以解决错误,但如果数据库中不存在具有该 ID 的图书,您会收到 BookDoesNotExist 异常。您可以使用get_object_or_404 来处理这个问题:

from django.shortcuts import get_object_or_404

def detail(request,id):
    bk=get_object_or_404(book, id=id)
    ...

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 2017-11-05
    • 1970-01-01
    • 2023-03-28
    • 2021-04-24
    • 2022-01-13
    • 2023-03-18
    • 2022-08-05
    • 2021-06-13
    相关资源
    最近更新 更多