Добавление дополнительных полей в UserAdmin - PullRequest
2 голосов
/ 05 августа 2011

У меня есть этот пользовательский класс

class CustomUserAdmin(UserAdmin):
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'email', 'password1', 'password2', 'location')}
        ),
    )
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (('Personal info'), {'fields': ('first_name', 'last_name', 'email', 'location')}),
        (('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions')}),
        (('Important dates'), {'fields': ('last_login', 'date_joined')}),
        (('Groups'), {'fields': ('groups',)}),
    )
    #UserAdmin.list_display += ('location',)
    add_form = MyUserCreationForm
    form = MyUserChangeForm

Работает нормально, пока я не раскомментирую эту строку

UserAdmin.list_display + = ('location',)

тогда это дает мне эту ошибку: CustomUserAdmin.list_display [5], 'location' не является вызываемым объектом или атрибутом 'CustomUserAdmin' или не найден в модели 'User'.

любая помощь?

[Изменить]

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

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    location = models.CharField(max_length=30)

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

1 Ответ

2 голосов
/ 05 августа 2011

Вы не собираетесь изменять UserAdmin, верно?

Предположим, что location является фактическим полем CustomUser, попробуйте использовать

list_display = UserAdmin.list_display + ('location',)

РЕДАКТИРОВАТЬ: более простой ответ

Используйте стандартный способ django для показа пользовательских вещей в list_display:

class CustomUserAdmin(UserAdmin):
    # other things

    def user_location(self, u):
        try:
            return u.get_profile().location
        except:
            return ''
    user_location.short_description = 'Location'

    list_display = UserAdmin.list_display + ('user_location',)

РЕДАКТИРОВАТЬ: больше информации

В любом случае, если вы расширяете пользовательскую форму только для добавления полей профиля, вам следует обратиться по этой ссылке: http://www.thenestedfloat.com/articles/displaying-custom-user-profile-fields-in-djangos-admin/index.html, чтобы воспользоваться преимуществами встроенных функций и избежать воссоздания всей формы с нуля.

...