3

我有以下模型:

class Hospital(models.Model):
    name = models.CharField(max_length=200)
    authorized_users = models.ManyToManyField(User)

在 Hospital 管理页面上显示 filter_horizo​​ntal 小部件来管理 ManyToManyField 非常简单:

class HospitalAdmin(admin.ModelAdmin):
    filter_horizontal = ('authorized_users', )

admin.site.register(models.Hospital, HospitalAdmin)

但是,我真正想要的是在“更改用户”管理页面上显示该小部件,与用户的其余信息内联。理所当然地,ManyToManyFields 应该可以从两个方向修改 - 为单个医院授权多个用户,上述事实情况很好。然而,要在多家医院授权一个用户,目前的情况需要访问每家医院的管理页面并选择一个有问题的用户 - 荒谬。

我将补充一点,我正在使用 UserProfile 方法来存储有关用户的其他信息(他们是什么类型的用户等)。一种可能的解决方案是让医院的 ManyToManyField 引用 UserProfile 而不是 User。然后我可以添加一个ManyToManyField(Hospital, through=Hospital.authorized_users.through)to UserProfile,从而允许我将 filter_horizo​​ntal 小部件添加到两端。但是,这是不理想的,因为稍后引用该连接会很痛苦。想象一下,我想获得给定医院的第一个用户授权。而不是hosp_name.authorized_users.all()[0],我必须做类似的事情hosp_name.authorized_users.all()[0].user。我什至不确定如何完成相当于hosp_name.authorized_users.all()获取完整列表的操作(因为这将返回 s 的列表UserProfiles,而不是Users.

4

1 回答 1

7

更雄辩地说,我的目标是使多对多医院-用户关系的管理成为双向的。也就是说,在医院的管理页面上,您将获得用户的 filter_horizo​​ntal,而在用户管理页面上,您将获得医院的 filter_horizo​​ntal。

我放弃了与 User 建立关系的想法,而是使用 UserProfile 建立关系。我最终使用了这张 7 岁的 Django ticket底部提到的确切代码。

最后,我的代码是

#models.py
class ReverseManyToManyField(models.ManyToManyField):
    pass
try:
    import south
except ImportError:
    pass
else:
    from south.modelsinspector import add_ignored_fields
    add_ignored_fields([".*\.ReverseManyToManyField$",])

class Hospital(models.Model):
    name = models.CharField(max_length=200)
    authorized_users = models.ManyToManyField('UserProfile', blank=True)
    def __unicode__(self):
        return self.name

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    authorized_hospitals = ReverseManyToManyField(Hospital, through=Hospital.authorized_rads.through)

    def __unicode__(self):
        return self.user.username

#admin.py
##### Stuff to register UserProfile fields in the admin site
class UserProfileInline(admin.StackedInline):
    model=models.UserProfile
    can_delete = False
    verbose_name_plural = 'profiles'
    filter_horizontal = ('authorized_hospitals',)

class UserAdmin(UserAdmin):
    inlines = (UserProfileInline, )

class HospitalAdmin(admin.ModelAdmin):
    filter_horizontal = ('authorized_users', )

admin.site.unregister(User)
admin.site.register(User, UserAdmin)
##### END UserProfile Stuff

admin.site.register(models.Hospital, HospitalAdmin)
于 2013-02-20T09:37:25.793 回答