2013-05-14 51 views
0

在我的模型: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') 

我怎麼能顯示內部的用戶,如果用戶是教授還是學生管理的網站?是否有可能獲得像基於模型的個人薪水這樣的屬性。

回答

2

您可以在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

1

你可以使用一個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