gpt4 book ai didi

Django:在 'User Change' 管理页面上显示 filter_horizo​​ntal

转载 作者:行者123 更新时间:2023-12-05 01:38:05 25 4
gpt4 key购买 nike

我有以下模型:

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)UserProfile ,从而允许我将 filter_horizo​​ntal 小部件添加到两端。但是,这并不理想,因为稍后引用连接会很痛苦。想象一下,我想为给定的医院获得授权的第一个用户。而不是 hosp_name.authorized_users.all()[0] ,我必须做类似 hosp_name.authorized_users.all()[0].user 的事情.我什至不确定我将如何完成相当于 hosp_name.authorized_users.all() 的工作。获取完整列表(因为这将返回 UserProfiles 的列表,而不是 User s。

最佳答案

更 Eloquent 地说,我的目标是使多对多医院-用户关系的管理双向进行。也就是说,在 Hospitals 的管理页面上,您会为用户获得一个 filter_horizo​​ntal,而在用户管理页面上,您将获得一个与 Hospitals 相关的 filter_horizo​​ntal。

我放弃了与 User 建立关系的想法,而是与 UserProfile 建立关系。我最终使用了 this 7 year old standing 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)

关于Django:在 'User Change' 管理页面上显示 filter_horizo​​ntal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14828168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com