Django管理站点视图一对一班领域
问题描述:
在我的模型:Django管理站点视图一对一班领域
class Professor(models.Model):
user = models.OneToOneField(User)
salary = models.FloatField()
class Student(models.Model):
user = models.OneToOneField(User)
birth_date = models.DateField()
在我的admin.py
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
UserAdmin.list_display = ('email', 'first_name', 'last_name','is_active','date_joined', 'is_staff')
我怎么能显示内部的用户,如果用户是教授还是学生管理的网站?是否有可能获得像基于模型的个人薪水这样的属性。
答
您可以在list_display中使用自定义方法。这是代码:
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
from django.contrib.auth.models import User
class UserAdmin(DjangoUserAdmin):
list_display = ('email', 'first_name', 'last_name','is_active','date_joined', 'is_staff', 'user_type', 'salary')
def user_type(self, instance):
try:
instance.student
return "student"
except Student.DoesNotExist:
return "professor"
def salary(self, instance):
try:
return instance.professor.salary
except Professor.DoesNotExist:
return "N/A"
def queryset(self, request):
qs = super(UserAdmin, self).queryset(request)
# To reduce database calls
return qs.select_related('student', 'professor')
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
这将增加额外的列user_type
和salary
到change_list管理页面。
已更新: 感谢@Adrián López。现在从django内建的UserAdmin子类化。
答
你可以使用一个inline:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class ProfessorInline(admin.StackedInline):
model = Professor
class StudentInline(admin.StackedInline):
model = Student
class MyUserAdmin(UserAdmin):
inlines = [ProfessorInline, StudentInline]
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
它并不完美。它应显示在您的User
管理面板中的Professor
和Student
字段。它不会明确说明是否是Professor
或Student
。说实话没有多大意义,因为你没有使用债券,所以在技术上你可能会有User
谁同时是Professsor
和Student
。
如果您更喜欢它,也可以尝试TabularInline
。
这是缺少强制性的“模型”属性。 此外,它将允许编辑密码哈希,这将是一个相当混乱。让'UserAdmin'扩展django的''UserAdmin',如果你为'User'模型使用一个普通的模型管理员,那么你会失去很多功能。 – 2013-05-14 10:28:00
非常感谢! – belonious 2013-05-14 10:36:04