python - multiple - Django Admin: Pedido de ForeignKey y relaciones ManyToManyField que hacen referencia al Usuario
user model django (4)
Tengo una aplicación que hace uso de UserProfile
de Django para ampliar el modelo de User
Django incorporado. Se parece un poco a:
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
He agregado una nueva clase a mi modelo:
class Team(models.Model):
name = models.CharField(max_length=128)
manager = models.ForeignKey(User, related_name=''manager'')
members = models.ManyToManyField(User, blank=True)
Y está registrado en el Administrador:
class TeamAdmin(admin.ModelAdmin):
list_display = (''name'', ''manager'')
admin.site.register(Team, TeamAdmin)
Por desgracia, en la interfaz de administrador, cuando selecciono un administrador del cuadro desplegable o establezco los miembros del equipo a través del campo de selección múltiple, están ordenados por el ID numérico del usuario. Por mi vida, no puedo encontrar la manera de ordenarlos.
Tengo una clase similar con:
class Meta:
ordering = [''name'']
Eso funciona genial! Pero no soy "dueño" de la clase User
, y cuando pruebo este truco en UserAdmin
:
class Meta:
ordering = [''username'']
Yo obtengo:
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
tampoco funciona. Podría especificar, como image_url_s
si quisiera. . . ¿Cómo puedo decirle al administrador que ordene mis listas de usuarios por username
de username
? ¡Gracias!
Para mí, la única solución de trabajo fue usar Proxy Model . Como se indica en la documentación, puede crear modelos de proxy propios incluso para modelos incorporados y personalizar cualquier cosa como en los modelos normales:
class OrderedUser(User):
class Meta:
proxy = True
ordering = ["username"]
def __str__(self):
return ''%s %s'' % (self.first_name, self.last_name)
Después de eso, en su modelo simplemente cambie la clave externa a:
user = models.OneToOneField(OrderedUser, unique=True)
o incluso más adecuado
user = models.OneToOneField(OrderedUser, unique = True, parent_link = True)
Esta
class Meta:
ordering = [''username'']
debiera ser
ordering = [''user__username'']
si está en tu clase de administrador UserProfile. Eso detendrá la excepción, pero no creo que te ayude.
Ordenar el modelo de Usuario como usted describe es bastante complicado, pero vea http://code.djangoproject.com/ticket/6089#comment:8 para una solución.
Una forma sería definir un formulario personalizado para usar para su modelo de equipo en el administrador y anular el campo manager
para usar un conjunto de preguntas con el orden correcto:
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
Esto podría ser peligroso por alguna razón, pero esto se puede hacer en una línea en el archivo models.py
su proyecto:
User._meta.ordering=["username"]