我有以下模型:
class UserProfile(models.Model):
user = models.OneToOneField(User)
class Property(models.Model):
user = models.ForeignKey(User)
我想创建一个TabularInline
显示每个属性连接到一个特定的UserProfile
在其管理页面上。当然,这里的问题是属性没有直接指向UserProfile
的ForeignKey
,所以我不能简单地编写
class PropertyTabularInline(admin.TabularInline):
model = Property
class UserProfileAdmin(admin.ModelAdmin):
inlines = (PropertyTabularInline,)
我怎样才能轻松地做我想做的事呢?
发布于 2015-09-17 08:19:24
您可以覆盖用户管理页面以同时显示Profile
和Property
模型。
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
发布于 2015-09-18 17:59:06
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中,如下所示:
class UserProfileAdmin(admin.ModelAdmin):
inlines = (PropertyTabularInline,)
还没有测试过,但这应该可以工作。
发布于 2015-09-17 22:46:00
这可以通过在模型中进行一次更改来实现。
不是创建从UserProfile
到User
的OneToOne关系,而是创建UserProfile
的子类User
。代码应该是这样的:
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
模型(这将需要创建一些返回正确类型的自定义函数并手动更改迁移),但如果这对你来说不是问题,它可能是一个很好的解决方案。
https://stackoverflow.com/questions/32561595
复制相似问题