2009-06-30 23 views
5

Estoy tratando de entender mejor el administrador de django y, al mismo tiempo, estoy tratando de agregar un campo más al administrador de usuario actual. En models.py que he hechoPara el administrador de django, ¿cómo agrego un campo al modelo de usuario y lo edito en el administrador?

User.add_to_class('new_field', models.BooleanField(default=False)) 

y en admin.py Tengo el siguiente (con conjuntos de campos, básicamente, sólo copiados de django/contrib/auth/admin.py)

class AdjUserAdmin(UserAdmin): 
    list_display = UserAdmin.list_display + ('new_field',) 
    list_filter = UserAdmin.list_filter + ('new_field',) 

    fieldsets = UserAdmin.fieldsets 
    fieldsets[1][1]['fields'] = ('first_name','last_name','email','new_field') 

el problema es que cuando hago esto me sale el error:

AdjUserAdmin.fieldsets[4][1]['fields']' refers to field 'new_field' that is missing from the form.

he mirado en UserChangeForm, pero parece que se trata de una Ya está instalando correctamente User como modelo. No estoy seguro de por qué new_field falta en el formulario.

Gracias

En lo que respecta a este código maloliente siendo

Sé que esto es una forma de parches apestoso mono de ir haciendo esto, pero me da la subclasificación cuestiones principalmente para these razones .. si yo podría hacer que funcione de la manera indicada anteriormente, sería feliz ... y tal vez maloliente.

En lo que respecta a la forma recomendada

Soy consciente de la forma recomendada de crear un perfil de usuario, al igual que en situaciones particulares, no veo el mérito en la creación de toda una nueva tabla y tener una llamada adicional a la base de datos cuando todo lo que quiero almacenar es un poco más de información, como is_private o algo así. Si estoy almacenando mucha más información, entonces estoy de acuerdo, la configuración de un perfil de usuario es preferible.

Respuesta

12

Primero, "¿está enchufado?" pregunta - ¿Ha agregado new_field manualmente a la tabla de usuarios en la base de datos? Syncdb no se habría ocupado de eso, por supuesto.

Después de eso, me gustaría tratar de anexar los campos en el UserAdmin existente en lugar de reconstruir desde cero:

from django.contrib.auth.admin import UserAdmin 

UserAdmin.list_display += ('new_field',) # don't forget the commas 
UserAdmin.list_filter += ('new_field',) 
UserAdmin.fieldsets += ('new_field',) 
+1

Hmm .. No sé por qué yo ni º tinta de eso después de usar list_display = UserAdmin.list_display + ('new_field',) .. gracias! – Silfheed

+2

Cuando uso: UserAdmin.list_display + = ('Alias') UserAdmin.list_filter + = ('Alias') UserAdmin.fieldsets + = ('Alias') <-----> hay algo mal, como esto: : (admin.E008) El valor de 'fieldsets [4]' debe ser una lista o tupla. <-----> y i chang a: UserAdmin.list_display + = ('apodo',) UserAdmin.list_filter + = ('apodo',) UserAdmin.fieldsets + = (('apodo', { 'los campos de los: ('nickname',)}),) <-----> este problema se ha ido. – bovenson

4

Es preferible escribir su propia clase de perfil de usuario, y adjuntarlo al modelo de usuario. Luego puede usar el método get_profile() para recuperar el perfil del usuario.

Subclasificar el administrador de perfil de un administrador en línea también debería permitirle editar el perfil en la página del usuario, que es casi lo que está tratando de hacer.

Este post tiene un muy buen reportaje sobre el tema: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

0

que tiene el error 'que no se encuentra en la forma', y descubrió que era debido a mi campo está marcado como 'editable = Falso 'en el modelo.

2

A pesar de sus preocupaciones de búsqueda de base de datos para tener un perfil de usuario, esa es realmente la forma en que debería ir para este problema.Hay dos razones principales para esto:

  1. El modelo de usuario se encuentra estrechamente unida al sistema de autenticación de Django y para muchos otros plugins. Monkey parcharlo no es una buena idea.

  2. Django tiene soporte incorporado para crear perfiles de usuario y muchas extensiones saben cómo jugar muy bien con ellas. Al usar perfiles de usuario (ver http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users para la discusión principal sobre esto) puede beneficiarse de eso.

Si usted está mirando para agregar funcionalidad a la interfaz de administración para los usuarios, entonces esta nota puede ser útil:

http://www.thenestedfloat.com/articles/displaying-custom-user-profile-fields-in-djangos-admin/index.html

Saludos,

Ian

2
Sólo

descubrió esto, quizás esto podría ayudarte también.

Puesto que usted no hablar de que usted tiene un perfil distinto, si desea simplemente agregar una columna con el administrador de usuario existente, puede hacer lo siguiente en admin.py:

En primer lugar se crea un administrador personalizado subclases UserAdmin:

class CustomUserAdmin(UserAdmin): 
    list_display = UserAdmin.list_display + ('is_complete',) 

    def is_complete(self, obj): 
     # Example here, you can use any expression. 
     return SomeOtherClass.objects.get(my_field=obj).is_complete() 

    # Not required, but this gives you a nice boolean field: 
    is_complete.boolean = True 

A continuación, anular el registro del UserAdmin existentes y registrar su propia:

admin.site.unregister(User) 
admin.site.register(User, CustomUserAdmin) 
Cuestiones relacionadas