Django-迭代模板中的数据

时间:2018-09-06 02:23:59

标签: python django refactoring jinja2

我想做的是遍历颜色列表,如果卡片包含上述颜色,则将其放置在模板的适当列中。我很难重构代码以允许其以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 %}

0 个答案:

没有答案