Что я хотел бы сделать, так это перебрать список цветов и поместить карту в соответствующий столбец в шаблоне, если карта содержит указанный цвет. Мне трудно рефакторинг кода, чтобы сделать это в СУХОЙ манере.
Я бы хотел иметь возможность обновить код один раз и применить его ко всем цветам, а не иметь отдельную логику для каждого цвета (как это происходит в настоящее время).
Вот вид, с которым я сейчас работаю:
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 %}