Python 仅为数据库中要循环通过的行返回查询集
我有两个相同大小的元素列表,我想加入它们,然后输出到Django模板 但是我在识别行时遇到了问题,所以只能打印该行 我正在尝试压缩这两个列表,然后创建一个新列表,该列表将循环到模板页面上 当我在模板上使用变量时,就像下面的代码一样,它工作得很好,但我希望能够在列表中循环 我知道这是不正确的,因为并非所有元素都打印到模板中,但它会创建所需的结果Python 仅为数据库中要循环通过的行返回查询集,python,django,python-3.x,django-views,Python,Django,Python 3.x,Django Views,我有两个相同大小的元素列表,我想加入它们,然后输出到Django模板 但是我在识别行时遇到了问题,所以只能打印该行 我正在尝试压缩这两个列表,然后创建一个新列表,该列表将循环到模板页面上 当我在模板上使用变量时,就像下面的代码一样,它工作得很好,但我希望能够在列表中循环 我知道这是不正确的,因为并非所有元素都打印到模板中,但它会创建所需的结果 <p> {{ news.esp_article.0 }}</p>
<p> {{ news.esp_article.0 }}</p>
<p> {{ news.eng_article.0 }}</p>
<hr>
<p> {{ news.esp_article.1 }}</p>
<p> {{ news.eng_article.1 }}</p>
<hr>
<p> {{ news.esp_article.2 }}</p>
<p> {{ news.eng_article.2 }}</p>
<hr>
<p> {{ news.esp_article.3 }}</p>
<p> {{ news.eng_article.3 }}</p>
<hr>
<p> {{ news.esp_article.4 }}</p>
<p> {{ news.eng_article.4 }}</p>
然后我得到数据库中每一行的完整原始数据
这是我的模板文件:
{% for text1, text2 in zip_scripts %}
<p>{{ text1 }}</p>
<p>{{ text2 }}</p>
{% endfor %}
谢谢您需要添加一个简单的代码来修复查询集。值列表返回一个元组。为了让它返回一个列表,您需要添加flat=True 试试这个:
eng_articles = Newspapers.objects.values_list('eng_article', flat=True)
esp_article = Newspapers.objects.values_list('esp_article', flat=True)
在查询集中,您应该使用获取一个dict列表,其中每个dict对应于数据库中的一行。然后,在模板中,可以使用访问每行的单个列值 views.py: 类ArticleViewPageDetailView: 模型=报纸 模板名称='rtves/article.html' 上下文\对象\名称='news' def get_context_dataself,**kwargs: eng_articles=报纸.对象.值'eng_articles' esp\u文章=报纸.对象.值'esp\u文章' zip_scripts=Zippeng_文章,特别是文章 上下文=超级。获取上下文数据**kwargs context.updatezip_scripts=zip_scripts 返回上下文 rtves/article.html: {article_eng的百分比,article_esp在zip_脚本中的百分比} {{article_eng.text} {{article_esp.text} {%endfor%} 我不确定你的models.py是什么样子。您是为一家报纸还是所有报纸获取英文和西班牙文相关文章的列表?注意:使用单数名词作为模型名称,即报纸末尾不带s。您在顶级列表上运行zip,报纸查询设置在列表列表列表中,而不是两个文章列表—英语文章和esp文章 这是假设ArticleViewPage一次只能显示一份报纸的英文和西班牙文文章 作为替代解决方案,您可以不在视图的get_context_data方法中压缩文章,而是在模型上提供压缩的文章,如下所示: 类新闻纸模型。模型: esp_articles=ArrayFieldmodels.CharFieldmax_length=8000,blank=True eng_articles=ArrayFieldmodels.CharFieldmax_length=8000,blank=True @财产 def articles_zippedself: 返回zipself.esp_文章、self.eng_文章 并更新模板以使用新模型属性:
{% for article_spanish, article_english in news.articles_zipped %}
<p>{{ article_spanish }}</p>
<p>{{ article_english }}</p>
{% endfor %}
谢谢,但这不起作用,我以前试过。谢谢,但没有使用值返回任何内容,我尝试了一些不同的方法。我已经更新了我的问题,因为我的模型是数组集。谢谢Models.py。我已经创建了另一个答案:非常感谢,这已经解决了问题,请您将我链接到可能有您使用的文档的地方。标题是模板上的@属性,以便我可以了解更多有关它的信息。再次感谢。我很高兴它起作用了!编辑并删除了.title,但不应包含它们。@property decorator将该方法转换为getter,在python代码中很有用,但在Django模板中访问时并不一定需要。详情如下:
class Newspapers(models.Model):
esp_article = ArrayField(models.CharField(max_length=8000, blank=True))**
eng_article = ArrayField(models.CharField(max_length=8000, blank=True))**
eng_articles = Newspapers.objects.values_list('eng_article', flat=True)
esp_article = Newspapers.objects.values_list('esp_article', flat=True)
class ArticleViewPage(DetailView):
model = Newspapers
template_name = 'rtves/article.html'
context_object_name = 'news'
def get_context_data(self, **kwargs):
zip_scripts = zip(self.object.eng_articles, self.object.esp_articles)
context = super().get_context_data(**kwargs)
context.update(zip_scripts=zip_scripts)
return context
{% for article_spanish, article_english in news.articles_zipped %}
<p>{{ article_spanish }}</p>
<p>{{ article_english }}</p>
{% endfor %}