2009-05-28 14 views
12

Ho un modello che ha una ForeignKey per il modello utente incorporato in django.contrib.auth e sono frustrato dal fatto che la casella di selezione nell'amministratore viene sempre ordinata dalla chiave primaria dell'utente.Riordina utenti in django auth

Preferisco farlo ordinare per nome alfabetico, e anche se è il mio istinto a non voler smanettare con le viscere di Django, non riesco a trovare un modo più semplice per riordinare gli utenti.

Il modo più semplice mi viene in mente sarebbe quello di immergere nel mio Django installare ed aggiungere

ordering = ('username',) 

alla classe Meta del modello utente.

Esiste qualche tipo di monkeypatching che potrei fare o qualsiasi altro modo meno invasivo per modificare l'ordinamento del modello Utente?

In alternativa, qualcuno può qualcosa che potrebbe rompersi apportando questo cambiamento?

risposta

23

È possibile utilizzare ModelAdmin objects per specificare il proprio modulo. Specificando il proprio modulo, si ha il controllo completo sulla composizione e sulla convalida del modulo.

Dire che il modello che ha un FK a User è Foo.

tuo myapp/models.py potrebbe assomigliare a questo:

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

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

Si potrebbe quindi creare un file contenente myapp/admin.py qualcosa di simile:

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 volta fatto questo, il menu a discesa <select> ordinerà il oggetti utente in base al nome utente. Non è necessario preoccuparsi di altri campi su Foo ... è sufficiente specificare le sostituzioni nella classe FooAdminForm. Sfortunatamente, dovrai fornire questa definizione di modulo personalizzato per ogni modello con un FK per utente che desideri presentare nel sito di amministrazione.

+0

questo ha funzionato benissimo per me – Rasiel

+0

L'ordine funziona alla grande, ma ora quei campi stanno arrivando come richiesto. Come posso mantenerli opzionali? – thumbtackthief

14

di Jarret risposta di cui sopra dovrebbe in realtà leggere:

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) 

in modo che il set di query ottiene rivalutati ogni volta che si crea la forma, a differenza di una volta, quando viene importato il modulo che contiene il modulo.

+2

Sembra una risposta molto migliore che creerà automaticamente tutti i campi richiesti oltre il campo Utente. –

Problemi correlati