在django模板中使用相关字段名称

cja*_*gir 0 django django-templates foreign-key-relationship

我有两个模型如下:

class A(models.Model):
    a = models.BooleanField(default=False)
    q = models.BooleanField(default=False)

class B(models.Model):
    c = models.Foreignkey('A', related_name='bb')
    d = models.BooleanField(default=False)
    e = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

class Myview(ListView):

    model = A
    template_name = 'admin/layer.html'

    def get_context_data(self, *args, **kwargs):
        context = super(ListView, self).get_context_data(*args, **kwargs)
        context['mylist'] = A.objects.filter(bb__e=False)
        return context
Run Code Online (Sandbox Code Playgroud)

一切都工作正常,除了在我的模板'admin/layer.html'我尝试这个:

{% for list in mylist %}
    {{ list.bb.d }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

但我没有得到任何价值{{ list.bb.d }}我可以在django模板中以这种方式使用相关的字段名称吗?

AKS*_*AKS 5

请注意,list.bb只会给你RelatedManager.这里的实例A可以与多个实例相关B.

因此,要获得它们,您需要使用以下语法:

{% for a_obj in mylist %}
    {% for b_obj in a_obj.bb.all %}
        {{ b_obj }}
    {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

这里提供更多细节:

您可以FOO_set通过related_nameForeignKey定义中设置参数来覆盖名称.例如,如果Entry模型被更改为blog = ForeignKey(Blog, on_delete=models.CASCADE, related_name='entries'),上面的示例代码将如下所示:

>>> b = Blog.objects.get(id=1)  
>>> b.entries.all() # Returns all Entry objects related to Blog.
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果只有一个`B`对象应该链接到'A`,你应该切换到使用`OneToOneField`. (2认同)