首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django管理中的间接内联

Django管理中的间接内联
EN

Stack Overflow用户
提问于 2015-09-14 17:39:34
回答 3查看 1.4K关注 0票数 19

我有以下模型:

代码语言:javascript
复制
class UserProfile(models.Model):
    user = models.OneToOneField(User)

class Property(models.Model):
    user = models.ForeignKey(User)

我想创建一个TabularInline显示每个属性连接到一个特定的UserProfile在其管理页面上。当然,这里的问题是属性没有直接指向UserProfileForeignKey,所以我不能简单地编写

代码语言:javascript
复制
class PropertyTabularInline(admin.TabularInline):
    model = Property

class UserProfileAdmin(admin.ModelAdmin):
    inlines = (PropertyTabularInline,)

我怎样才能轻松地做我想做的事呢?

EN

回答 3

Stack Overflow用户

发布于 2015-09-17 08:19:24

您可以覆盖用户管理页面以同时显示ProfileProperty模型。

代码语言:javascript
复制
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from myapp.models import *

class ProfileInline(admin.TabularInline):
    model = Profile

class PropertyInline(admin.TabularInline):
    model = Property

class UserAdmin(UserAdmin):
    inlines = (ProfileInline, PropertyInline,)

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

您还可以删除显示的任何不需要/未使用的用户属性(例如,组或权限)

更多信息请点击这里:https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#extending-the-existing-user-model

这里:https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#a-full-example

票数 2
EN

Stack Overflow用户

发布于 2015-09-18 17:59:06

代码语言:javascript
复制
class PropertyTabularInline(admin.TabularInline):
    model = Property

    def formfield_for_dbfield(self, field, **kwargs):
        if field.name == 'user':
            # implement your method to get userprofile object from request here.
            user_profile = self.get_object(kwargs['request'], UserProfile)
            kwargs["queryset"] = Property.objects.filter(user=user_profile)
        return super(PropertyInLine, self).formfield_for_dbfield(field, **kwargs)

完成后,您可以将此内联代码添加到用户UserProfileAdmin中,如下所示:

代码语言:javascript
复制
class UserProfileAdmin(admin.ModelAdmin):
    inlines = (PropertyTabularInline,)

还没有测试过,但这应该可以工作。

票数 1
EN

Stack Overflow用户

发布于 2015-09-17 22:46:00

这可以通过在模型中进行一次更改来实现。

不是创建从UserProfileUser的OneToOne关系,而是创建UserProfile的子类User。代码应该是这样的:

代码语言:javascript
复制
class UserProfile(User):
    # some other fields, no relation to User model

class Property(models.Model):
    user = models.ForeignKey(User)

这将导致创建与User模型具有隐藏OneToOne关系的UserProfile模型,它不会复制用户模型。

完成此更改后,您的代码将正常工作。在幕后有一些变化,比如UserProfile不再有自己的ID,你可以从UserProfile内部的User访问字段,很难使用settings.AUTH_USER_MODEL交换User模型(这将需要创建一些返回正确类型的自定义函数并手动更改迁移),但如果这对你来说不是问题,它可能是一个很好的解决方案。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32561595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档