django generic.listview中的额外上下文

时间:2015-04-13 05:22:12

标签: django django-generic-views

所以我有两个型号:Car and Picture。一辆车可能有多张照片。

现在我想使用列表视图显示所有车辆以及每辆车的一张图片,有人可以告诉我该怎么做? 以下是我的代码

# models.py
class Car(models.Model):
  name = models.CharField(max_length=100)
class Picture(models.Model):
  car = models.ForeignKey(Car,related_name='pictures')
  picture = models.ImageField()

# views.py
class CarList(ListView):
  model = Car

3 个答案:

答案 0 :(得分:8)

列表视图有一个方法get_context_data。您可以将此覆盖为senf额外上下文到模板中。

def get_context_data(self,**kwargs):
    context = super(CarList,self).get_context_data(**kwargs)
    context['picture'] = Picture.objects.filter(your_condition)
    return context

然后,在您的模板中,您可以根据需要访问picture对象。

我想这可以解决你的问题。

答案 1 :(得分:2)

您可以使用模板中的car.pictures.all直接访问每个Car对象的相关Picture对象。

所以你可以做点什么,

{% for car in objects %}
    {{ car.name }}
    {% if car.pictures.all %}<img src="{{ car.pictures.all.0.picture.url }}" />{%endif %}
{% endfor %}

如需了解更多信息,请阅读Related Objects

答案 2 :(得分:1)

由于我想通过带有queryset的表单,因此以下方法对我有用。

def get_queryset(self):
    return Men.objects.filter(your condition)

def get_context_data(self,**kwargs):
    context = super(Viewname,self).get_context_data(**kwargs)
    context['price_form']=PriceForm(self.request.GET or None)
    return context

使用get_queryset(),您可以定义一个基本查询集,该基本查询集将由super()中的get_context_data()实现。