背景:我有以下访客管理应用程序的模型。每个站点可以有多个访问者,每个访问者可以访问多个站点。我找不到在每个网站上显示访问者列表或显示访问者访问过的网站列表的方法。我删除了不必要的字段。
.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管理员站点列表
访客列表如下所示:Django管理员访问者列表
问题如何显示每个网站的访问者列表,反之亦然?例如:如果我点击Gingin Gravity Precint,我想在下面的表格中查看与之相关的访客列表;网站详细信息";。类似于显示的访问者列表,但特定于网站。Django管理员特定站点
首先,我会在模型Site中显式显示related_name。这并不是绝对必要的,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']