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_typesalary到change_list管理页面。

已更新: 感谢@Adrián López。现在从django内建的UserAdmin子类化。

+0

这是缺少强制性的“模型”属性。 此外,它将允许编辑密码哈希,这将是一个相当混乱。让'UserAdmin'扩展django的''UserAdmin',如果你为'User'模型使用一个普通的模型管理员,那么你会失去很多功能。 – 2013-05-14 10:28:00

+0

非常感谢! – belonious 2013-05-14 10:36:04

你可以使用一个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管理面板中的ProfessorStudent字段。它不会明确说明是否是ProfessorStudent。说实话没有多大意义,因为你没有使用债券,所以在技术上你可能会有User谁同时是ProfesssorStudent

如果您更喜欢它,也可以尝试TabularInline