Python 当模型在不同的应用程序中时,有许多字段django模板

Python 当模型在不同的应用程序中时,有许多字段django模板,python,django,templates,many-to-many,Python,Django,Templates,Many To Many,我的问题类似于。 我有两个模型与m2m字段链接,我想在模板中渲染字段。当我的两个型号在不同的应用程序中时,我如何做到这一点: apps/qapp/models class Area(models.Model): name = models.CharField(max_length=100, primary_key=True) def __unicode__(self): return self.name apps/worksheets/models clas

我的问题类似于。 我有两个模型与m2m字段链接,我想在模板中渲染字段。当我的两个型号在不同的应用程序中时,我如何做到这一点:

apps/qapp/models

class Area(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
    def __unicode__(self):
        return self.name

apps/worksheets/models

class Place(models.Model):
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=100, primary_key=True)
    area = models.ManyToManyField('qapp.Area',related_name='area')

正如Schwobasegll提到的,事实上你们的模型在不同的应用程序中并没有区别。通过
manytomy
关系连接的渲染字段应该基本相同

如果我理解正确,问题是您没有使用
相关的\u名称
,并且您共享的代码片段实际上不是您的实际代码

但为了完整起见,万一将来有人发现这个问题:

不强制使用
相关的\u名称
。如果
manytomy
关系定义为:

class Place(models.Model):
    # ...
    area = models.ManyToManyField('qapp.Area')
区域
实例中,您将能够如下导航:

area = Area.objects.get(pk=1)
places = area.place_set.all()
因为Django会自动添加一个反向关系
%(model\u name)\u set
。如果您设置了一个
相关的\u名称
,它将覆盖默认名称

最后,为了增强代码的可读性,与
区域
模型的关系将更好:

class Place(models.Model):
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=100, primary_key=True)
    areas = models.ManyToManyField('qapp.Area', related_name='places')
manytomy
关系使用复数形式。毕竟,它是两侧
区域
位置
的集合,因此
区域
位置


现在,要在模板中呈现一个
ManyToMany
字段,您可以这样做(考虑到您的视图返回了一个名为
Area
Area
实例):

<h1>Currect area: {{ area.name }}</h1>
<h2>Places:</h2>
<ul>
  {% for place in area.places.all %}
    <p>{{ place.name }}</p>
  {% endfor %}
</ul>
当前区域:{{area.name}
地点:
    {area.places.all%中的位置为%s} {{place.name}

    {%endfor%}

正如Schwobasegll所提到的,事实上,您的模型在不同的应用程序中并没有什么区别。通过
多个
关系连接的渲染字段应该基本相同

如果我理解正确,问题是您没有使用
相关的\u名称
,并且您共享的代码片段实际上不是您的实际代码

但为了完整起见,万一将来有人发现这个问题:

使用
related\u name
不是强制性的。如果
manytomy
关系定义为:

class Place(models.Model):
    # ...
    area = models.ManyToManyField('qapp.Area')
区域
实例中,您将能够如下导航:

area = Area.objects.get(pk=1)
places = area.place_set.all()
因为Django会自动添加反向关系
%(型号名称)\u set
。如果设置
相关的\u名称
,它将覆盖默认名称

最后,为了增强代码的可读性,与
区域
模型的关系将更好:

class Place(models.Model):
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=100, primary_key=True)
    areas = models.ManyToManyField('qapp.Area', related_name='places')
manytomy
关系使用复数形式。毕竟,它是两侧
区域
位置
的集合,因此
区域
位置


现在,要在模板中呈现一个
ManyToMany
字段,您可以这样做(考虑到您的视图返回了一个名为
Area
Area
实例):

<h1>Currect area: {{ area.name }}</h1>
<h2>Places:</h2>
<ul>
  {% for place in area.places.all %}
    <p>{{ place.name }}</p>
  {% endfor %}
</ul>
当前区域:{{area.name}
地点:
    {area.places.all%中的位置为%s} {{place.name}

    {%endfor%}

有两种方法可以在模板中显示m2m字段数据

  • 如果要显示与某个区域相关的所有位置,请参见@Vitor的答案

  • 如果要显示与单个位置相关的所有区域,请参见下文-

  • 查询位置设置
    place1=Place.objects.filter(id=1)

    现在在模板中

    {% for place2 in place1 %}
    
        {% for area1 in place2.area.all %}
    
            <p>{{area1.name}}</p>
    
        {% endfor %}
    
    {% endfor %}
    
    {place1%中place2的%
    {place2.area.all%中区域1的%
    {{area1.name}

    {%endfor%} {%endfor%}

    我特意采用了上述变量,以便新手了解将哪个变量放在何处。

    有两种方法可以在模板中显示m2m字段数据

  • 如果要显示与某个区域相关的所有位置,请参见@Vitor的答案

  • 如果要显示与单个位置相关的所有区域,请参见下文-

  • 查询位置设置
    place1=Place.objects.filter(id=1)

    现在在模板中

    {% for place2 in place1 %}
    
        {% for area1 in place2.area.all %}
    
            <p>{{area1.name}}</p>
    
        {% endfor %}
    
    {% endfor %}
    
    {place1%中place2的%
    {place2.area.all%中区域1的%
    {{area1.name}

    {%endfor%} {%endfor%}

    我特意采用了上述变量,以便新手能够理解将哪个变量放在哪里。

    请这样做:
    areas=models.ManyToManyField('qapp.Area',related_name='places'))
    在不同的应用程序中,表单字段没有什么区别。到底是什么问题?好吧,我的错,我没有使用相关的名称。谢谢:
    areas=models.ManyToManyField('qapp.Area',related\u name='places'))
    在不同的应用程序中,表单字段没有什么不同。到底是什么问题?好吧,我的错,我没有使用相关的名称。thanksI最初认为不同应用程序中的m2m字段行为不同,所以我感到困惑。你是对的,代码片段仅供参考。感谢你提供完整的示例问题的规划。顺便说一句,你的教程很棒。我最初认为不同应用程序中的m2m字段表现不同,所以我感到困惑。你是对的,代码片段仅供参考。感谢你对问题提供了完整的解释。顺便说一句,你的教程很棒。