【问题标题】:Displaying a many-to-many relationship in Django在 Django 中显示多对多关系
【发布时间】:2021-11-13 02:03:38
【问题描述】:

背景: 我有以下用于访客管理应用程序的模型。每个站点可以有多个访问者,每个访问者可以访问多个站点。我无法找到一种方法来显示每个站点上的访问者列表或显示访问者访问过的站点列表。我删除了不必要的字段。

.models.py

class Site(models.Model):
  name = models.CharField(max_length=100, unique=True)
  accomodation = models.BooleanField(default=False)
  visitors = models.ManyToManyField('Visitor', blank=True)

class Visitor(models.Model):
  name = models.CharField(max_length=50, null=False, blank=False)
  email = models.EmailField(max_length=200, null=False, blank=False, unique=True)
  ...

admin.py

class AdminArea(admin.AdminSite):
  
vms_admin = AdminArea(name='vms_admin')

@admin.register(Site, site=vms_admin)
class SiteAdmin(admin.ModelAdmin):
  fieldsets = (*removed*)
  list_display = [*removed*]
  list_filter = (*removed*)

@admin.register(Visitor, site=vms_admin)
class VisitorAdmin(admin.ModelAdmin):
  fieldsets = (*removed*)
  list_display = [*removed*]
  list_filter = (*removed*)

Django 管理员

网站列表如下所示: Django Admin Site List

访问者列表如下所示: Django Admin Visitor List

问题 如何显示每个站点的访问者列表,反之亦然? 例如: 如果我单击 Gingin Gravity Precinct,我想在“站点详细信息”下方的表格中查看与其相关的访问者列表。类似于显示的访问者列表,但特定于站点。 Django Admin Specific Site

【问题讨论】:

    标签: django django-models django-views django-templates django-admin


    【解决方案1】:

    首先,我会在模型站点中明确相关名称。这不是绝对必要的,Django 创建了一个默认的向后引用,我只是不记得它的名字,所以我喜欢明确。

    visitors = models.ManyToManyField('Visitor', blank=True, related_name='sites')
    

    我假设您希望在单击单个访问者时查看网站列表,换句话说,在访问者详细信息管理页面上。在这种情况下,您只需在 VisitorAdmin 中指定字段sites。反之亦然,以在 SiteAdmin 中显示访问者。然后,您将获得所有访问者的列表,其中选择了活跃的访问者。

    class SiteAdmin(Admin):
        fieldsets = (
            ('Visitors', {'fields': ('visitors')})
        )
    

    如果您想在访问者列表管理页面中显示(可能很长)网站列表,您可以在访问者模型上定义一个属性,并将该属性添加到 list_fields

    class Visitor(Model):
        @property
        def list_of_sites(self):
            return self.sites.all().values_list(name, flat=True)
    
    class SiteAdmin(Admin):
        list_display = ['name', 'accomodation', 'list_of_sites']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2021-08-28
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      相关资源
      最近更新 更多