Django Admin: Ordinazione di ForeignKey e ManyToManyField relazioni fanno riferimento per l'utente
-
16-09-2019 - |
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!
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)