2012-04-18 24 views
5

Buenas tardes,Extender el perfil de usuario en Django. Creación de usuarios de administrador

Actualmente estoy creando un sitio con Django y extendí al usuario con un perfil de usuario. Aunque tengo un pequeño problema. Aquí está mi situación:

  1. Amplié el perfil del usuario para agregar campos personalizados.
  2. Agregué el modelo al Modelo de administración de usuarios, así que cuando agrego un usuario, puedo completar los campos directamente para crear el perfil.
  3. Ahora, si no agrego NADA en estos nuevos campos de usuario personalizados, en la página de agregar usuarios, Django Admin no me lanzará un error diciendo que estos campos son nulos (y no se supone que sean)
  4. Quiero que me arroje un error en esta página de Agregar administrador de usuario, por lo que los administradores TENDRÁN que completar un perfil cuando agreguen un nuevo usuario.
  5. TODOS los usuarios se agregarán en el Panel de administración.

¿Esto es posible? ¡Muchas gracias!

en admin.py

from django.contrib import admin 
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin 
from django.contrib.auth.models import User 
from accounts.models import UserProfile 


class UserProfileInline(admin.TabularInline): 
    model = UserProfile 


class UserAdmin(DjangoUserAdmin): 
    inlines = [ UserProfileInline,] 


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

En model.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    employee_number = models.PositiveIntegerField(unique=True) 

    def __unicode__(self): 
     return 'Number' 

Respuesta

5

Por defecto, inline vacío está permitida y por lo tanto no más lejos de verificación sería tomado para una forma vacía. Debe sobrescribirlo manualmente:

class UserProfileForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(UserProfileForm, self).__init__(*args, **kwargs) 
     if self.instance.pk is None: 
      self.empty_permitted = False # Here 

    class Meta: 
     model = UserProfile 


class UserProfileInline(admin.TabularInline):   
    model = UserProfile        
    form = UserProfileForm 
+0

¡Funcionó! ¿Te importa explicar un poco más lo que hace el código? Especialmente el Class Meta: ¡parte! Gracias amigo – abisson

+0

Además, ¿cuál sería la sintaxis si quisiera tener solo uno de mis campos para estar vacío_permitido = falso? y el resto es verdad? – abisson

+0

@abisson 'empty_permitted' es un parámetro no documentado que' BaseForm' acepta: cuando un formulario enviado no ha sido cambiado desde sus datos iniciales, y 'empty_permitted' es' True', 'full_clean()' del formulario no funcionará cualquier validación adicional. Puede verificar 'empty_permitted' en' django/forms/forms.py' y 'django/forms/formsets.py'. Si desea que uno de los campos no esté vacío, puede intentar establecer 'empty_permitted = True' para el formulario y' blank = True' para otros campos. – okm

Cuestiones relacionadas