2011-07-28 28 views
6

He agregado un campo adicional para el usuario haciendo todo el proceso en el que se hace la aplicación de perfil de usuario y extendiendo el módulo de usuario.Extendiendo formulario de usuario nuevo, en el administrador Django

Parece que no hay error. Lo que no puedo entender, o encontrar en cualquier lugar es cómo mostrar este nuevo campo en la página donde un administrador crea un nuevo usuario. Por lo tanto, bajo información personal como nombre y apellido, quiero que haya un campo de ubicación que agregué al perfil de usuario.

mi Perfil de Usuario:

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

class UserProfile(models.Model): 
    # This field is required. 
    user = models.OneToOneField(User) 

    # Other fields here 
    location = models.CharField(max_length=20) 

# definition of UserProfile from above 
# ... 

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

post_save.connect(create_user_profile, sender=User) 

También me gustaría saber cómo hacer que el correo electrónico obligatorio, como la contraseña y nombre de usuario. Simplemente cambiando el modelo de usuario en la carpeta Django a:

email = models.EmailField(_('e-mail address'), unique=True) 

no funcionó en absoluto.

[ACTUALIZACIÓN] Así que este es mi sombrero admin.py que creé. ¿Dónde debería incluir esto en el archivo settings.py para que realmente use la carpeta con el módulo de usuario agregado y el nuevo formulario? que tienen esta línea pero tampoco parece utilizar la nueva forma del todo AUTH_PROFILE_MODULE = 'UserProfile.UserProfile' (tengo una carpeta llamada PerfilUsuario que contiene los dos snipets de código)

from django.contrib import admin 
from django.contrib.auth.models import User,Group 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import UserCreationForm, UserChangeForm 
from django import forms 
from django.contrib.admin.views.main import * 

class MyUserCreationForm(UserCreationForm): 
    """ 
    A form that creates a user, with no privileges, from the given username and password. 
    """ 
    OFFICES = (
     (0, "Global"), 
     (1, "Dublin"), 
     (2, "Tokyo"), 
     (3, "Warsaw"), 
     (4, "Beijing"), 
     (5, "Seoul"), 
     (6, "Taipei"), 
     (7, "Orem"), 
     (8, "Mountain View"), 
     (9, "San Luis Obispo"), 
     (10, "Roseville"), 
     (11, "Pune"), 
     (12, "i18n") 
    ) 
    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^[\[email protected]+-]+$', 
     help_text = _("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."), 
     error_messages = {'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")}) 
    password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput) 
    password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput, 
     help_text = _("Enter the same password as above, for verification.")) 
    location = forms.IntegerField(label=_("Location"), choices=TYPE_CHOICES) 

    class Meta: 
     model = User 
     fields = ("username",) 

    def clean_username(self): 
     username = self.cleaned_data["username"] 
     try: 
      User.objects.get(username=username) 
     except User.DoesNotExist: 
      return username 
     raise forms.ValidationError(_("A user with that username already exists.")) 

    def clean_password2(self): 
     password1 = self.cleaned_data.get("password1", "") 
     password2 = self.cleaned_data["password2"] 
     if password1 != password2: 
      raise forms.ValidationError(_("The two password fields didn't match.")) 
     return password2 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 


class CustomUserAdmin(UserAdmin): 
    add_form = MyUserCreationForm 
    inlines = [ProfileInline,] 
    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('username', 'email', 'password1', 'password2', 'location')} 
     ), 
    ) 


admin.site.unregister(User) 
admin.site.register(User, CustomUserAdmin) 
admin.site.register(Class, ClassAdmin) 

Respuesta

16

podrás necesita usar su propia clase UserAdmin y modificar la propiedad add_fieldsets para alterar los campos que se muestran. See this Stack Overflow question for an example.

Si desea editar su instancia de Perfil de usuario al mismo tiempo que el Usuario, un enfoque es agregar el Perfil de usuario como una línea en su UserAdmin personalizado. Espero que te ayude.

Ejemplo de des-registrar el administrador modelo integrado para el usuario, y el registro de uno personalizado:

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

admin.site.unregister(User) 

class MyUserAdmin(UserAdmin): 
    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('username', 'email', 'password1', 'password2')} 
     ), 
    ) 

admin.site.register(User, MyUserAdmin) 
+0

Lo siento, sólo estoy tratando de poner en práctica este momento, ya que no tuve tiempo antes y Me estoy confundiendo por todos los enlaces. Supongo que necesito crear un nuevo archivo .py con el código para la clase MyUserAdmin (UserAdmin): que has especificado en http://stackoverflow.com/questions/6628452/how-can-i-have-django-user-registration -single-step-instead-of-two-stepprocess/6630174 # 6630174? – Angie

+0

Sí, puede poner el código en su propio archivo admin.py – Brandon

+0

Actualicé mi código, pero no estoy seguro de cómo hacer que mi sitio web realmente lo use. Hasta ahora, es solo una carpeta con archivos .py que no están vinculados al proyecto principal – Angie

Cuestiones relacionadas