[英]django admin site view one to one classes fields
在我的模型中:
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)
它将在change_list管理页面中添加其他列user_type
和salary
。
更新 :感谢@AdriánLópez 。 现在从django内置的UserAdmin进行子类化。
您可以使用内联 :
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
。 老实说,这没有多大意义,因为您没有使用继承,因此从技术上来说,您可能会同时拥有既是Professsor
又是Student
的User
。
如果您更喜欢TabularInline
,也可以尝试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.