Django 3:将数据添加到 DetailView

Posted

技术标签:

【中文标题】Django 3:将数据添加到 DetailView【英文标题】:Django 3: Adding Data to DetailView 【发布时间】:2020-09-22 10:43:37 【问题描述】:

我有一个与this 和this 非常相似的问题,我猜我忽略了一些东西。

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

models.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)

views.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 中工作。

【问题讨论】:

【参考方案1】:

你必须使用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 %

【讨论】:

上下文对象删除因为尴尬的命名setts.setts.all?谢谢,成功了!

以上是关于Django 3:将数据添加到 DetailView的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Django 将表单中的数据添加到数据库中

将字段添加到 Django 的现有数据库(版本 < 1.7)

如何将字典(或其他数据类型)添加到 Django 中的帐户

django 手动将模型字段添加到 postgres 数据库

Django:如何根据来自行的数据和来自另一个模型的数据将聚合字段添加到查询集中?

Django - 将行添加到 MySQL 数据库