Django评论系统开发问题:表单配置与路由请求报错排查
Django评论系统表单配置及错误修复方案
1. 解决"Request not found"错误
你看到的错误URL http://127.0.0.1:8000/%7Burl%20'add_review'%20dish.id%7D 是因为模板中的URL标签未被正确解析,直接当成字符串传递了。修正方法如下:
修正HTML表单的action属性
将表单的action改为Django模板URL标签,确保指向正确的提交接口:
<form action="{% url 'add_review' dish.id %}" method="post"> {% csrf_token %} {{ form.as_p }} <p><input type="submit" value="Add comment"></p> </form>
注意:
- 渲染
index.html时,必须将对应的dish实例传入模板上下文(比如在视图中通过get_object_or_404获取后,用render(request, 'index.html', {'dish': dish})传递) - 确保
{% url %}标签的语法正确,没有拼写错误
2. 完善视图逻辑
当前AddReview视图存在两个核心问题:未关联评论到具体菜品、未处理重复提交风险。修改后的代码如下:
from django.shortcuts import get_object_or_404, redirect from .models import Reviews, Dish class AddReview(View): """评论提交视图""" def post(self, request, pk): form = ReviewForm(request.POST) # 根据URL中的pk获取对应的菜品对象 dish = get_object_or_404(Dish, pk=pk) if form.is_valid(): review = form.save(commit=False) # 将评论关联到当前菜品(假设Reviews模型的外键字段名为dish,需根据你的模型调整) review.dish = dish review.save() # 处理完成后重定向,避免刷新页面重复提交 return redirect('index') # 替换为你的首页或菜品详情页的URL名称
3. 检查模型关联
确保Reviews模型包含指向Dish的外键字段,示例如下:
from django.db import models class Reviews(models.Model): dish = models.ForeignKey(Dish, on_delete=models.CASCADE, related_name='reviews') name = models.CharField(max_length=100) email = models.EmailField() text = models.TextField() # 可添加其他字段,如创建时间等
4. 模板中渲染评论列表
如果需要在页面展示已有评论,可在index.html中添加遍历逻辑:
<h1 style="margin:0 57%">Reviews</h1> {% for review in dish.reviews.all %} <div style="margin: 1rem 0; padding: 1rem; border: 1px solid #eee;"> <h4>{{ review.name }}</h4> <p>{{ review.text }}</p> </div> {% empty %} <p>暂无评论,快来写下第一条吧!</p> {% endfor %}
内容的提问来源于stack exchange,提问作者Eralife7
相关产品推荐
相关产品推荐

