3

私は次のモデルを持っています:

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

ManyToManyFieldを管理するためにHospital管理ページにfilter_horizo​​ntalウィジェットを表示するのは非常に簡単です。

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

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

ただし、私が本当に望んでいるのは、そのウィジェットを「ユーザーの変更」管理ページに、残りのユーザー情報と同じように表示することです。ManyToManyFieldsが両方向から変更可能である必要があるのは当然のことです。1つの病院で複数のユーザーを承認するには、上記の事実上の状況で問題ありません。ただし、複数の病院で1人のユーザーを承認するには、現在の状況では、各病院の管理ページにアクセスして、問題の1人のユーザーを選択する必要があります。

UserProfile方法論を使用して、ユーザーに関する追加情報(ユーザーのタイプなど)を保存していることを追加します。考えられる解決策の1つは、病院のManyToManyFieldがUserではなくUserProfileを参照するようにすることです。次に、にを追加しManyToManyField(Hospital, through=Hospital.authorized_users.through)UserProfile、filter_horizo​​ntalウィジェットを両端に追加できるようにします。ただし、後で接続を参照するのは面倒なので、これは理想的ではありません。特定の病院の最初のユーザーを承認したいとします。ではなくhosp_name.authorized_users.all()[0]、私はのようなことをしなければならないでしょうhosp_name.authorized_users.all()[0].user。完全なリストを取得するのと同等の方法をどのように実行するかさえわかりません(これにより、sではなくのhosp_name.authorized_users.all()リストが返されます。UserProfilesUser

4

1 に答える 1

7

より雄弁に言えば、私の目標は、多対多の病院とユーザーの関係の管理を双方向にすることでした。つまり、病院の管理ページでは、ユーザーのfilter_horizo​​ntalを取得し、ユーザー管理ページでは、病院のfilter_horizo​​ntalを取得します。

私はUserとの関係を作るという考えを捨て、代わりにUserProfileでそれを作りました。私はこの7歳の立っているDjangoチケットの下部に記載されている正確なコードを使用することになりました。

結局、私のコードは

#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 に答える