我想做的是遍历颜色列表,如果卡片包含上述颜色,则将其放置在模板的适当列中。我很难重构代码以允许其以DRY方式使用。
我希望能够一次更新代码并将其应用于所有颜色,而不是为每种颜色使用单独的逻辑(就像当前一样)。
这是我当前正在使用的视图:
class SetList(ListView):
template_name = 'set_list.html'
context_object_name = 'cards'
def get_queryset(self):
set_name_from_url = self.kwargs['set_name']
set_name_title = set_name_from_url.title()
return sorted(CardModel.objects.all().filter(
set_name=set_name_title),
key=lambda x: x.name)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
set_name_from_url = self.kwargs['set_name']
set_name_title = set_name_from_url.title()
colors = ['white', 'blue', 'black', 'red', 'green', 'gold-artifacts-and-lands']
context['colors'] = colors
for color in colors:
context[color] = sorted(CardModel.objects.all().filter(
set_name=set_name_title,
color_identity=color),
key=lambda x: x.name)
return context
和模板内容:
{% block content %}
<div class="row">
<div class="col-2">
{% for card in white %}
<p> {{ card }}</p>
{% endfor %}
</div>
<div class="col-2">
{% for card in blue %}
<p>{{ card }}</p>
<img src="{{ card.image_url }}">
{% endfor %}
</div>
</div>
{% endblock %}
我希望模板(或查看是否更有效)看起来像这样:
{% block content %}
<div class="row">
{% for color in colors %}
<div class="col-2">
{% for card in color %}
<p> {{ card }}</p>
{% endfor %}
</div>
{% endfor %}
</div>
{% endblock %}