2009-09-24 8 views
18

Ho un'applicazione che fa uso di Django UserProfile per estendere il modello integrato Django User. Sembra un po 'come:Django Admin: Ordinamento di ForeignKey e ManyToManyField relazioni di riferimento Utente

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    # Local Stuff 
    image_url_s = models.CharField(max_length=128, blank=True) 
    image_url_m = models.CharField(max_length=128, blank=True) 

    # Admin 
    class Admin: pass 

ho aggiunto una nuova classe per il mio modello:

class Team(models.Model): 
    name = models.CharField(max_length=128) 
    manager = models.ForeignKey(User, related_name='manager') 
    members = models.ManyToManyField(User, blank=True) 

Ed è iscritto nella Admin:

class TeamAdmin(admin.ModelAdmin): 
    list_display = ('name', 'manager') 

admin.site.register(Team, TeamAdmin) 

Ahimè, nel inteface di amministrazione , quando vado a selezionare un manager dalla casella di riepilogo, o impostare i membri del team tramite il campo di selezione multipla, sono ordinati dall'ID numerico dell'utente. Per la vita di me, non riesco a capire come ottenere questi ordinati.

Ho una classe simile con:

class Meta: 
    ordering = ['name'] 

che funziona alla grande! Ma io non "proprio" la classe User, e quando provo questo trucco in UserAdmin:

class Meta: 
    ordering = ['username'] 

ottengo:

django.core.management.base.CommandError: One or more models did not validate: events.userprofile: "ordering" refers to "username", a field that doesn't exist.

user.username non funziona neanche. Potrei specificare, come image_url_s se volessi. . . come posso dire all'amministratore di ordinare i miei elenchi di utenti entro il username? Grazie!

risposta

24

Un modo sarebbe quello di definire un modulo personalizzato da utilizzare per il modello di team in amministrazione, e ignorare il campo manager di usare un set di query con il corretto ordine:

from django import forms 

class TeamForm(forms.ModelForm): 
    manager = forms.ModelChoiceField(queryset=User.objects.order_by('username')) 

    class Meta: 
     model = Team 

class TeamAdmin(admin.ModelAdmin): 
    list_display = ('name', 'manager') 
    form = TeamForm 
+0

Grazie, Daniel! – dannyman

+2

Dal momento che django 1.8 richiede anche 'fields = '__all __'' all'interno di 'Class Meta'. – Flash

26

Questo

class Meta: 
    ordering = ['username'] 

dovrebbe essere

ordering = ['user__username'] 

se è nella classe UserProfile admin. Questo fermerà l'eccezione, ma non penso che ti aiuti.

Ordinare il modello Utente come descritto è piuttosto complicato, ma vedere http://code.djangoproject.com/ticket/6089#comment:8 per una soluzione.

3

questo potrebbe essere pericoloso per qualche ragione, ma questo può essere fatto in una sola riga nel file del progetto models.py:

User._meta.ordering=["username"] 
1

Per me, l'unica soluzione di lavoro è stato quello di utilizzare Proxy Model.Come indicato nella documentazione, è possibile creare propri modelli di proxy per i modelli anche built-in e personalizzare nulla di simile in modelli regolari:

class OrderedUser(User): 
    class Meta: 
     proxy = True 
     ordering = ["username"] 
    def __str__(self): 
     return '%s %s' % (self.first_name, self.last_name) 

Dopo di che, nel modello basta cambiare chiave esterna:

user = models.OneToOneField(OrderedUser, unique=True) 

o anche più adatto

user = models.OneToOneField(OrderedUser, unique = True, parent_link = True) 
Problemi correlati