Domanda

Ho un'applicazione che fa uso di UserProfile di Django di estendere il built-in Django modello User. Sembra un po 'come:

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)

E si è registrato nella Admin:

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

admin.site.register(Team, TeamAdmin)

Purtroppo, nel inteface admin, quando vado a selezionare un manager dalla casella a discesa, o membri del team impostati tramite il campo di selezione multipla, che sono ordinate per l'ID numerico dell'utente. Per la vita di me, non riesco a capire come ottenere questi allineati.

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 indicare, come image_url_s se volevo. . . come posso dire l'amministratore per ordinare le mie liste di utenti da username? Grazie!

È stato utile?

Soluzione

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 l'ordine corretto:

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

Altri suggerimenti

Questo

class Meta:
    ordering = ['username']

dovrebbe essere

    ordering = ['user__username']

se è nella tua classe UserProfile admin. Che verrà fermata l'eccezione, ma non credo che ti aiuta.

per l'ordine modello User come lei è abbastanza difficile, ma vedere http: // codice .djangoproject.com / biglietti / 6089 # commento:. 8 per una soluzione

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

User._meta.ordering=["username"]

Per quanto mi riguarda, l'unica soluzione di lavoro è stato quello di utilizzare Proxy modello. 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top