with multiple implement how create python django sorting admin user-profile

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"]