Django模板中如何并排展示字典两个键的对应值
你遇到的核心问题是当前的字典结构把question和answer拆成了两个独立的列表,直接遍历字典的items只会逐个输出整个列表的内容,没法实现位置对应的配对展示。下面给你两种实用的解决方案:
方案一:在视图层调整数据结构(推荐)
最清晰的做法是在视图里把对应位置的问题和答案提前配对成元组或小字典的列表,这样模板里的逻辑会非常简单。
修改你的视图代码
可以去掉原来的dict_lyrics和z列表,直接生成配对后的列表:
paired_lyrics = [] for word in user_word: x = lyrics_list_clean.index(word) flash = Flashcard.objects.get(owner=self.request.user, question=word) # 直接把对应位置的问题和答案配对加入列表 paired_lyrics.append( (lyrics_list_clean[x], flash.answer) ) # 将配对后的列表传入context context['paired_lyrics'] = paired_lyrics
模板中使用
在模板里直接循环这个配对列表即可:
{% for question_word, answer_word in paired_lyrics %} {{ question_word }} - {{ answer_word }}<br> {% endfor %}
这样就能按你想要的格式输出:
word1 - word3
word2 - word4
方案二:在模板层通过索引配对(不推荐,仅作备选)
如果不想修改视图的结构,你可以利用Django模板的循环索引来对应两个列表的元素,但要确保question和answer列表长度完全一致:
模板代码
假设你已经把dict_lyrics['question']和dict_lyrics['answer']分别传入了context(也就是你原来的context['question']和context['answer']):
{% for q in question %} {{ q }} - {{ answer|get_item:forloop.counter0 }}<br> {% endfor %}
注意:Django模板默认没有get_item过滤器,需要你自己自定义一个,在app的templatetags目录下创建过滤器:
# 在你的app下创建 templatetags/custom_filters.py from django import template register = template.Library() @register.filter def get_item(lst, index): try: return lst[index] except IndexError: return ''
然后在模板开头加载这个过滤器:
{% load custom_filters %}
这种方法虽然不用改视图,但需要额外自定义过滤器,而且可读性不如方案一,所以更推荐第一种方式。
为什么原来的循环不行?
你之前用{% for key, value in dict_lyrics.items %}时,字典的items()会返回键值对的迭代器,先遍历'question'键并输出整个['word1', 'word2']列表,再遍历'answer'键输出整个['word3', 'word4']列表,自然没法实现位置对应的配对展示。
内容的提问来源于stack exchange,提问作者MeL

