【问题标题】:Django Admin Inlines With OneToOne Field带有 OneToOne 字段的 Django Admin 内联
【发布时间】:2014-12-28 07:45:42
【问题描述】:

在我的模型中,您可以看到我的 SpecializedProfile 与 UserProfile 具有 OneToOne 关系,与 django 用户模型具有 OneToOne 关系。

我想为包含 UserProfile 和 django User 模型的内联的 SpecializedProfile 创建一个管理员,这样我就可以一次创建一个 SpecializedProfile,而无需转到 UserProfile 页面和用户页面。

这是我的模型:

class UserProfile(models.Model):
    user_auth = models.OneToOneField(User, related_name="profile", primary_key=True)
    # more fields...


class SpecializedProfile(models.Model):
    profile = models.OneToOneField(UserProfile, related_name="specialized_profile", primary_key=True)
    # More fields...

这是我创建管理员的尝试:

class UserInline(admin.TabularInline):
    model = User
    fk_name = 'profile__specialized_profile'

class ProfileInline(admin.TabularInline):
    model = UserProfile
    fk_name = 'specialized_profile'

class SpecializedProfileAdmin(admin.ModelAdmin):
    model = SpecializedProfile
    inlines = [
        UserInline, ProfileInline
    ]

admin.site.register(SpecializedProfile, SpecializedProfileAdmin)

管理员不工作,我收到此错误:

<class 'profiles.admin.ProfileInline'>: (admin.E202) 'profiles.UserProfile' has no field named 'trainer'.
<class 'profiles.admin.UserInline'>: (admin.E202) 'auth.User' has no ForeignKey to 'profiles.SpecializedProfile'.

django 似乎希望内联出现在定义 OneToOne 字段的模型上,并且不接受反向关系。我宁愿不必去重组我的模型来完成这项工作......我可以做些什么来让内联与我的模型一起工作吗?

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    我通过使反向内联而不是从配置文件到用户而是从覆盖的用户到配置文件来修复了该错误:

    class ProfileInline(admin.StackedInline):
        model = Profile
    
    class IspUserAdmin(UserAdmin):
        list_display = ('username', 'first_name', 'last_name', 'email', 'is_staff', 'is_superuser', 'is_active')
        list_filter = ('date_joined', 'last_login', 'is_staff', 'is_superuser', 'is_active',)
        inlines = (ProfileInline,)
    
    admin.site.unregister(User)
    admin.site.register(User, IspUserAdmin)
    

    然后我还调整了个人资料管理员(删除了添加操作并将一些字段链接更改为自定义链接)。

    【讨论】:

      【解决方案2】:

      github 上有一个 django 模块可以为您执行此操作,而无需您反转关系:django_reverse_admin

      安装后,您的管理员将如下所示:

      # admin.py
      from django_reverse_admin import ReverseModelAdmin
      
      
      class SpecializedProfileAdmin(ReverseModelAdmin):
          model = SpecializedProfile
          inline_reverse = ['profile']
          inline_type = 'tabular'  # could also be 'stacked'
      
      admin.site.register(SpecializedProfile, SpecializedProfileAdmin)
      

      不幸的是,我认为它不能做嵌套内联(Django 也不能),所以这只能解决你的部分问题。我知道您不想更改数据库结构,但 SpecializedProfile 看起来更像是 UserProfile 的子类。如果你像这样重写你的模型:

      class SpecializedProfile(UserProfile):
          # More fields...
      

      那么你可以有这样的管理员:

      # admin.py
      from django_reverse_admin import ReverseModelAdmin
      
      class UserProfileAdmin(ReverseModelAdmin):
          model = UserProfile
          inline_reverse = ['user_auth']
          inline_type = 'tabular'
      
      
      class SpecializedProfileAdmin(ReverseModelAdmin):
          model = SpecializedProfile
          inline_reverse = ['user_auth']
          inline_type = 'tabular'
      
      admin.site.register(SpecializedProfile, SpecializedProfileAdmin) 
      admin.site.register(UserProfile, UserProfileAdmin)
      

      这样,您可以查看 UserProfile 和 SpecializedProfile 的所有内容。

      【讨论】:

        【解决方案3】:

        nested inlines (inline inside inline) 中没有办法django.contrib.admin

        也许这对你有帮助:

        class UserInline(admin.TabularInline):
            model = User
        
        class ProfileInline(admin.TabularInline):
            model = UserProfile
            inlines = [UserInline]
        
        class SpecializedProfileAdmin(admin.ModelAdmin):
            model = SpecializedProfile
            inlines = [ProfileInline]
        

        您还需要提供自己的模板,这些模板将在顶级内联和子内联中嵌套迭代。

        也可以看看this,也许对你有帮助。

        【讨论】:

          猜你喜欢
          • 2014-01-02
          • 1970-01-01
          • 1970-01-01
          • 2017-03-17
          • 2015-02-08
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          • 1970-01-01
          相关资源
          最近更新 更多