2017-06-27 33 views
2

我想在Django admin用戶(/auth/user/)部分添加自定義列。Django用戶配置文件中的自定義列

models.py

from django.db import models 
from django.contrib.auth.models import User 
from django.db.models.signals import post_save 
from django.dispatch import receiver 

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    birthday = models.DateField() 

    def __str__(self): 
     return self.user.username 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

而且在admin.py我有這樣的代碼:

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.models import User 

class ProfileInline(admin.StackedInline): 
    model = Profile 
    can_delete = False 
    verbose_name_plural = 'Custom fields' 

class CustomUser(UserAdmin): 
    inlines = (ProfileInline,) 
    list_diplsay = ('birthday') 

    def get_inline_instances(self, request, obj=None): 
     if not obj: 
      return list() 
     return super(CustomUser, self).get_inline_instances(request, obj) 


admin.site.unregister(User) 
admin.site.register(User, CustomUser) 

我在這裏讀了list_display應該做的所有的工作,但在我的情況不起作用。自從我添加該行後,我在管理面板中看不到任何更改。

問題在哪裏?謝謝!

編輯:通過更改list_diplsaylist_display修復。現在我得到這個:type object 'User' has no attribute 'birthday'。有任何想法嗎?

回答

4

你有一個錯字:list_diplsay應該是list_display。您應該也可以添加一個尾隨逗號到您的列表值:('birthday',)。這可以確保您最終得到一個元組而不是單個值。

編輯:

由於birthday場不屬於User你就必須添加看它在你的管理類中的方法:

class CustomUser(UserAdmin): 
    list_display = ('birthday',) 

    def birthday(self, obj): 
     return obj.profile.birthday 

(我有隻顯示管理員類的相關部分;您現有的inlines等應留下。)

+0

您應該爲此目的使用列表。它最初是爲了節省內存而設計的,但現在它是無關緊要的。 '= ['生日']' –

+0

是的,這可能也會起作用。我們實際上並不知道OP使用的是什麼版本的Django。 – Chris

+0

現在我得到這個:'type object'User'沒有'birthday'屬性。任何想法?謝謝! – Cosocit

相關問題