2009-05-28 18 views
12

Tengo un modelo que tiene una ForeignKey para el modelo de usuario incorporado en django.contrib.auth y me siento frustrado por el hecho de que la casilla de selección en el administrador siempre ordena por la clave principal del usuario.Reordenar usuarios en django auth

Prefiero ordenarlo por nombre de usuario alfabéticamente, y si bien es mi instinto no querer jugar con las entrañas de Django, parece que no puedo encontrar una forma más sencilla de reordenar a los usuarios.

La manera más directa que se me ocurre sería que echar mano de mi Django instalar y añadir

ordering = ('username',) 

a la clase Meta del modelo de usuario.

¿Hay algún tipo de parche que podría hacer o cualquier otra forma menos invasiva de modificar el orden del modelo de usuario?

De forma alternativa, ¿alguien puede romper algo al hacer este cambio?

Respuesta

23

Hay una manera de usar ModelAdmin objects para especificar su propio formulario. Al especificar su propio formulario, tiene control total sobre la composición y validación del formulario.

Supongamos que el modelo que tiene un FK a User es Foo.

Su myapp/models.py podría tener este aspecto:

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

class Foo(models.Model): 
    user = models.ForeignKey(User) 
    some_val = models.IntegerField() 

A continuación, crear un archivo que contiene myapp/admin.py algo como esto:

from django.contrib.auth.models import User 
from django import forms 
from django.contrib import admin 

class FooAdminForm(forms.ModelForm): 
    user = forms.ModelChoiceField(queryset=User.objects.order_by('username')) 

    class Meta: 
     model = Foo 

class FooAdmin(admin.ModelAdmin): 
    form = FooAdminForm 

admin.site.register(Foo, FooAdmin) 

Una vez hecho esto, el <select> desplegable ordenará la objetos de usuario de acuerdo con el nombre de usuario. No necesita preocuparse por otros campos en Foo ... solo necesita especificar las anulaciones en su clase FooAdminForm. Lamentablemente, deberá proporcionar esta definición de formulario personalizado para cada modelo que tenga un FK al Usuario que desee presentar en el sitio de administración.

+0

esto funcionó muy bien para mí – Rasiel

+0

El pedido funciona muy bien, pero ahora esos campos están apareciendo según sea necesario. ¿Cómo puedo mantenerlos como opcionales? – thumbtackthief

14

respuesta de Jarret por encima de realidad debe decir:

from django.contrib.auth.models import User 
from django.contrib import admin 
from django import forms 
from yourapp.models import Foo 

class FooAdminForm(forms.ModelForm): 
    class Meta: 
     model = Foo 

    def __init__(self, *args, **kwds): 
     super(FooAdminForm, self).__init__(*args, **kwds) 
     self.fields['user'].queryset = User.objects.order_by(...) 

class FooAdmin(admin.ModelAdmin): 
    # other stuff here 
    form = FooAdminForm 

admin.site.register(Foo, FooAdmin) 

por lo que el conjunto de consultas consigue re-evaluado cada vez que se crea el formulario, en lugar de una vez, cuando el módulo que contiene el formulario ha sido importada.

+2

Parece una respuesta mucho mejor que creará automáticamente todos los campos requeridos más allá del campo Usuario. –

Cuestiones relacionadas