1

我已经构建了一个子类 Django 的 ListView 的视图。目前它工作正常。它提供了来自我的 Artwork 类的对象列表,我可以在模板中对其进行迭代。

但是,我现在包含了一个(不是必需的)外键(系列),并且我想在显示 Artwork 对象时按系列对其进行分组。我还想按日期对它们进行排序,同时在其中穿插任何带有 series=None 的 Artwork 对象(也根据日期)。

像这样:

  1. 艺术品(12/2013)(系列=无)
  2. 艺术品(12/2013) 艺术品(12/2013) 艺术品(11/2013) (series='series1' 11/2013)
  3. 艺术品(10/2013)(系列=无)
  4. 艺术品(12/2013) 艺术品(12/2013) 艺术品(11/2013) (series='series2' 09/2013)

我的模型如下所示:

class Series(models.Model):
    title = models.CharField(max_length=200, unique=True)
    date = models.DateTimeField(default=timezone.now(), editable=False)
    def __unicode__(self):
        return self.title

class Artwork(models.Model):
    title = models.CharField(max_length=200, unique=True)
    series = models.ForeignKey(Series, blank=True, null=True, on_delete=models.SET_NULL)
    date = models.DateTimeField(default=timezone.now(), editable=False)
    image = models.ImageField(upload_to='artwork_images/%Y/%m/')
    def __unicode__(self):
        return self.title

我猜如果我的视图是为模板提供嵌套列表之类的东西,我可以以某种方式完成我想要的。ListView 有可能吗?或者我应该构建一个基于函数的视图?

如果这似乎是一个幼稚的问题,我们深表歉意。我是 Django/Python 世界(和 Stackoverflow!)的新手。任何意见或建议将不胜感激。

4

1 回答 1

0

我会为此使用基于普通函数的视图,但如果您愿意,可以使用ListView'get_context_data()方法返回任意数据。

  1. 为排序创建一个键函数:

    def key_function(artwork):
        if artwork.series is None:
            return (artwork.date, None)
        else:
            return (artwork.series.date, artwork.series)
    

    如果可用,该功能使用系列日期,否则使用艺术品日期。系列 id 是密钥的第二部分(如果可用),因此属于同一系列的艺术品彼此相邻,即使有多个系列具有相同的日期。

  2. 使用键对数据进行排序:

    def your_view(request):
        artwork = Artwork.objects.select_related()
        artwork_list_sorted = sorted(artwork, key=key_function)
        return render(request, "your_app/artwork_list.html", {'artwork_list_sorted': artwork_list_sorted})
    

    或使用ListView

    def get_context_data(self, **kwargs):
        context = super(ArticleListView, self).get_context_data(**kwargs)
        queryset = self.get_queryset()
        context['artwork_list_sorted'] = sorted(queryset, key=key_function)
        return context
    
  3. 使用重组模板标签对数据进行分组:

    {% regroup artwork_list_sorted by series as artwork_grouped %}
    
    {% for artwork in artwork_grouped %}
        {% for item in artwork.list %}
            {{ item.title }}({{ item.date }})
        {% endfor %}
        <strong>(series={{ artwork.grouper }})</strong>
    {% endfor %}
    

    或者只是遍历原始排序列表,在需要时显示系列 - 使用ifchanged 模板标签

    {% for artwork in artwork_list_sorted %}
        {{ artwork.title}}({{ artwork.date }})
        {% ifchanged %}<strong>(series={{ artwork.series.title }})</strong>{% endifchanged %}
    {% endfor %}
    
于 2013-10-04T08:24:39.860 回答