首页 > 解决方案 > Django 3:将数据添加到 DetailView

问题描述

我对这个这个有一个非常相似的问题,我的猜测是我忽略了一些东西。

我想从模板中的模型中查询相关对象(外键):

模型.py:

class PartBase(models.Model):
    name = models.CharField('Name', max_length=120)
    price = models.DecimalField("Price per part", decimal_places=2, max_digits=6)       

class Sett(models.Model):
    name = models.CharField('Name', max_length=120)

class PartRelation(models.Model):
    part = models.ForeignKey(PartBase, on_delete=models.CASCADE)
    qty = models.PositiveIntegerField("Quantity")
    sett = models.ForeignKey(Sett, related_name='setts', on_delete=models.SET_NULL, null=True)

视图.py:

class SetDetailView(DetailView):
    model = Sett
    context_object_name = "setts"

模板:

{% for p in setts.partrelation_set.all %}
  <p>value: {{ p.get_part_price }}</p>
{% endfor %}

问题:空 HTML 页面 - 所以 setts.partrelation_set.all 为空/不存在。

我尝试的是向视图类添加一个查询集:

class SetDetailView(DetailView):
    model = Sett
    context_object_name = "setts"
    queryset = Sett.objects.all()

    def get_queryset(self):
        return self.queryset.filter(setts = self.kwargs.get("Sett_id"))

但我在某个地方走错了方向。我还尝试在模型中添加很多返回属性方法,这样我就可以让它在 shell 中工作——但不能在 DetailView 中工作。

标签: djangodjango-modelsdjango-viewsdjango-templatesdjango-3.0

解决方案


你必须用来related_name调用子对象

{% for p in setts.setts.all %}
  <p>value: {{ p.get_part_price }}</p>
{% endfor %}

编辑

最好删除上下文对象名称并调用

{% for p in object.setts.all %}
  <p>value: {{ p.get_part_price }}</p>
{% endfor %}

推荐阅读