2009-07-31 11 views
7

En nuestra aplicación weba necesitamos permitir guiones "-" en nuestros nombres de usuario. He permitido que durante el proceso de registro de consumo muy bien con esta expresión regular r '^ [\ w -] + $'Permitir el carácter "-" en los nombres de usuario en la interfaz de administrador de Django

¿Cómo puedo saber la aplicación de administración para que pueda editar los nombres de usuario de autenticación> a los usuarios permite el caracter "-" en los nombres de usuario? Actualmente no puedo editar ningún nombre de usuario con guiones ya que devolverá un error de validación en el nombre de usuario.

Me gustaría intentar y evitar parchar django directamente si es posible. Soy bastante nuevo en la programación, pero ¿es esto para lo que usaría la "subclasificación"?

Respuesta

18

Esto debería ser tan simple como anular el comportamiento de la clase User ModelAdmin. En una de sus aplicaciones, en admin.py incluya el siguiente código.

from django.contrib import admin 
from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import UserCreationForm, UserChangeForm 

class MyUserCreationForm(UserCreationForm): 
    username = forms.RegexField(
     label='Username', 
     max_length=30, 
     regex=r'^[\w-]+$', 
     help_text = 'Required. 30 characters or fewer. Alphanumeric characters only (letters, digits, hyphens and underscores).', 
     error_message = 'This value must contain only letters, numbers, hyphens and underscores.') 

class MyUserChangeForm(UserChangeForm): 
    username = forms.RegexField(
     label='Username', 
     max_length=30, 
     regex=r'^[\w-]+$', 
     help_text = 'Required. 30 characters or fewer. Alphanumeric characters only (letters, digits, hyphens and underscores).', 
     error_message = 'This value must contain only letters, numbers, hyphens and underscores.') 

class MyUserAdmin(UserAdmin): 
    form = MyUserChangeForm 
    add_form = MyUserCreationForm 

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

Aquí hay una pequeña explicación.

La primera definición de clase (MyUserCreationForm) es una subclase (sí, su terminología es correcta) de UserCreationForm. Esta es la forma que aparece al hacer clic en "Agregar usuario" en el sitio de Administración de Django. Todo lo que estamos haciendo aquí es redefinir el campo username para usar nuestra expresión regular mejorada que acepta guiones y cambiar el helptext para reflejar esto.

La segunda definición de clase hace lo mismo, excepto UserChangeForm.

La definición de clase final es una subclase de UserAdmin, que es el ModelAdmin que el modelo de usuario usa por defecto. Aquí indicamos que deseamos utilizar nuestros nuevos formularios personalizados en ModelAdmin.

Tenga en cuenta que para cada una de estas subclases, solo cambiamos lo que tenemos que hacer. El resto de la clase se heredará de su padre (UserCreationForm, UserChangeForm y UserAdmin, respectivamente).

Finalmente, realizamos el importante paso de registrar el modelo de usuario con el sitio de administración. Para hacerlo, anulamos el registro de UserAdmin por defecto y luego nos registramos con nuestra clase mejorada MyUserAdmin.

Descubrirá que el sitio de administración de Django es muy fácil de personalizar con estas técnicas, especialmente si se tiene en cuenta que el sitio de administración es solo una aplicación de Django.

+0

Gracias sexto, eso tiene mucho sentido para mí, gracias por tomarse el tiempo para escribir la explicación detallada. –

+1

Muy buena explicación. –

Cuestiones relacionadas