Django中getqestion视图无法关联问题对应选项的技术问询
Django问题解决:Question与Choice关联异常修复
1. 先确认模型关联的正确性
检查Choice模型和Question的外键关联,必须设置正确的反向关联名称,这样才能直接通过问题对象获取它的专属选项:
# models.py class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='choices') text = models.CharField(max_length=200) # 其他字段按需添加
这里的related_name='choices'是核心,后续可以用question.choices.all()直接拿到该问题的所有选项,避免用默认的choice_set(容易写错)。
2. 修正视图的查询逻辑
在getqestion视图里,查询Items_buy对应的问题时,要一次性预加载关联的选项,既避免重复查询数据库,也能保证数据关联准确:
# views.py from django.shortcuts import get_object_or_404, render from .models import Items_buy def getqestion(request, item_pk): # 预加载item关联的所有questions,以及每个question的choices item = get_object_or_404(Items_buy.objects.prefetch_related('questions__choices'), pk=item_pk) # 取出该item对应的所有问题 questions = item.questions.all() return render(request, '模板文件名.html', {'questions': questions})
3. 调整前端模板的遍历逻辑
模板里必须先遍历每个问题,再在每个问题下遍历它自己的选项,不能直接遍历所有选项:
<!-- 你的HTML模板 --> {% for question in questions %} <div class="question-item"> <h4>{{ question.text }}</h4> <div class="choices"> {% for choice in question.choices.all %} <span>{{ choice.text }}</span> {% empty %} <p>这个问题还没有选项</p> {% endfor %} </div> </div> {% empty %} <p>当前商品没有对应的问题</p> {% endfor %}
之前的问题大概率是模板里直接遍历了所有Choice集合,而没有绑定到每个Question的choices属性上。
4. 确认URL配置没问题
检查urls.py里的路由是否正确接收item_pk参数:
# urls.py from django.urls import path from . import views urlpatterns = [ path('questions/<int:item_pk>/', views.getqestion, name='getqestion'), ]
最后测试验证
去后台创建测试数据:
- 创建一个
Items_buy实例(比如pk=1) - 给它加两个Question:test1、test2
- 给test1加da、net、HY TAKOE三个选项;给test2加2、1、3三个选项
然后访问对应路由(比如/questions/1/),看看每个问题是不是只显示自己的专属选项。
内容的提问来源于stack exchange,提问作者Богдан Савищев
相关产品推荐
相关产品推荐

