【问题标题】:How to display one set of data between two models?如何在两个模型之间显示一组数据?
【发布时间】:2021-10-03 20:57:18
【问题描述】:

我有示范问答。 我想要完成的是能够以这样的方式在模板中显示它。我想知道一种方法来实现这一点。我正在尽力不让它循环模型中的整个数据,而是一次循环一个数据。我正在尝试制作 qna 数据并使其显示在模板上。所以在答案数据之前显示所有 Questio 数据不是我想要的。这两个模型必须一一对应。我有点接近了......但我仍然无法弄清楚如何做到这一点。任何帮助或建议将不胜感激。提前谢谢你。

Q.title

Q.body

A.body

Q.title

Q.body

A.body

Q.title

Q.body

A.body

modesl.py

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

class Question(models.Model):
    title= models.CharField(max_length= 100)
    body= models.TextField()
    date_posted= models.DateTimeField(default=timezone.now)
    author= models.ForeignKey(User, on_delete= models.CASCADE)

    def __str__(self):
        return self.title

class Answer(models.Model):
    body= models.TextField()
    question= models.ForeignKey(Question, on_delete= models.CASCADE)
    date_posted= models.DateTimeField(default=timezone.now)
    author= models.ForeignKey(User, on_delete= models.CASCADE)

    def __str__(self):
        return self.body

qna.html 模板

{% extends "info/base.html" %}
{% block content %}

{% for question in questions %}
        <h1> Q</h1>
        <h3> {{ question.title }} </h3>
  {% for answer in answers %}
    <h1> A </h1> 
    <h3> {{ answer.body }}</h3>
  {% endfor %}

{% endfor %}




{% endblock content %}

views.py

from django.shortcuts import render
from .models import Question, Answer

def qna(request):
    context= {
        'questions': Question.objects.all(),
        'answers': Answer.objects.all(),
    }
    return render(request, 'qna/qna.html', context) 

【问题讨论】:

  • 一个问题可以有多个答案吗?
  • @Jafoor 每个问题我只想要一个答案。设计是只有一名管理员回答所有问题。这是一个小应用程序,所以我打算让它以这种方式工作

标签: python python-3.x django django-models django-templates


【解决方案1】:

由于 Answer 模型具有 ForeignKey 与 question 的关系,您可以直接反向访问问题模型字段。如下所示将您的代码替换为 html 并检查是否同样适用。

{% extends "info/base.html" %}
{% block content %}
{% for answer in answers %}
        <h1> Question:</h1>
        <h3> title:  {{ answer.question.title }} </h3>
        <h3> body: {{ answer.question.body }} </h3>
        <h1> Answer: </h1><h3> {{ answer.body }} </h3>
{% endfor %}

{% endblock content %}

【讨论】:

  • 这完美!!!!我正在寻找做这样的事情!非常感谢!!
  • @Kentypop:很高兴听到这个消息 :) 我也在学习,我知道还有其他最好的方法来实现它,但我认为这符合你的代码。
  • 很抱歉打扰您。但是我的大脑似乎无法理解为什么我之前的一段代码会循环所有的答案数据,但是你的代码的工作方式是一次只提取一个数据?
  • 它会循环所有答案,因为您已经放置了一个循环来迭代问题循环中的所有答案。当您尝试通过 {% for question in questions %} 行访问问题查询集中的第一个问题然后在该迭代中您再次放置一个循环以逐个迭代所有答案 {% for answer in answers %}。所以会发生什么在每次迭代问题时,您都在迭代所有答案。
  • 非常感谢!!!现在对我来说太清楚了。祝你有美好的一天,注意安全!
【解决方案2】:

related_name 添加到具有ForeignKeyQuestion 的模型Answer

question= models.ForeignKey(Question, on_delete= models.CASCADE, related_name='my_answes')

在 HTML 文件中将第二个循环替换为:

{% for answer in question.my_answes.all %}
   <h1> A </h1> 
   <h3> {{ answer.body }}</h3>
   <hr>
{% endfor %}

【讨论】:

  • 谢谢!!我不知道相关名称存在!欣赏它!
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多