2009-05-28 3 views
12

J'ai un modèle qui a un ForeignKey pour le modèle utilisateur intégré dans django.contrib.auth et je suis frustré par le fait que la boîte de sélection dans l'admin trie toujours par la clé primaire de l'utilisateur. Je préférerais qu'il soit trié par nom d'utilisateur par ordre alphabétique, et bien qu'il soit mon instinct de ne pas vouloir tripoter les entrailles de Django, je n'arrive pas à trouver un moyen plus simple de réordonner les utilisateurs.Réorganiser les utilisateurs dans django auth

La façon la plus simple que je peux penser serait plonger dans mon Django installer et ajouter

ordering = ('username',) 

à la classe Meta du modèle de l'utilisateur.

Existe-t-il une sorte de monkeypatching que je pourrais faire ou toute autre manière moins invasive pour modifier la commande du modèle User?

Sinon, quelqu'un peut-il quelque chose qui pourrait casser en faisant ce changement?

Répondre

23

Il existe un moyen d'utiliser ModelAdmin objects pour spécifier votre propre formulaire. En spécifiant votre propre formulaire, vous avez un contrôle total sur la composition et la validation du formulaire. Dites que le modèle qui a un FK à User est Foo.

Votre myapp/models.py pourrait ressembler à ceci:

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

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

Vous pouvez ensuite créer un fichier contenant myapp/admin.py quelque chose comme ceci:

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) 

Une fois que vous avez fait cela, dans le menu déroulant <select> ordonnera la objets utilisateur en fonction du nom d'utilisateur. Pas besoin de vous soucier des autres champs sur Foo ... il vous suffit de spécifier les remplacements dans votre classe FooAdminForm. Malheureusement, vous devrez fournir cette définition de formulaire personnalisé pour chaque modèle ayant un FK à Utilisateur que vous souhaitez présenter sur le site d'administration.

+0

cela a fonctionné très bien pour moi – Rasiel

+0

La commande fonctionne très bien, mais maintenant ces champs sont à venir selon les besoins. Comment puis-je les garder en option? – thumbtackthief

14

réponse de Jarret devrait effectivement lire ci-dessus:

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) 

de sorte que le réévaluées chaque fois que queryset obtient vous créez la forme, par opposition à la fois, lorsque le module contenant le formulaire est importé.

+2

Cela ressemble à une meilleure réponse qui créera automatiquement tous les champs requis au-delà du champ Utilisateur. –

Questions connexes