J'essaie de trier une page de liste d'administration Django par une valeur spécifique de l'ensemble de clés étrangères associé aux objets.
Spécifiquement, dans le code ci-dessous, je souhaite que la vue PRESSADMIN affiche une liste de tous les objets de contenu Trié par le "score Twitter" (l'objet Score avec nom "Twitter"). P>
dans l'application Django, j'ai les modèles suivants: p>
class ContentAdmin(admin.ModelAdmin):
list_display = ('title', 'show_twitter_score',)
def show_twitter_score(self, obj):
twitter_score = obj.score_set.get(name='Twitter')
return 'Twitter: ' + str(twitter_score.score)
3 Réponses :
Si je comprends bien, vous pouvez essayer cela de généralement, éléments de Cependant, si un élément de Par exemple: P>
list_display code> qui ne sont pas des champs de base de données réels ne peuvent pas être utilisés dans le tri (car Django effectue tout le tri au niveau de la base de données). P>
list_display code> représente un certain champ de base de données, vous pouvez indiquer ce fait en définissant l'attribut admin_order_field code> de l'élément. P>
class Person(models.Model):
first_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def colored_first_name(self):
return '<span style="color: #%s;">%s</span>' % (self.color_code, self.first_name)
colored_first_name.allow_tags = True
colored_first_name.admin_order_field = 'first_name'
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'colored_first_name')
Merci Cesar, mais je ne pense pas que cela fonctionnera pour moi. Utilisation de list_display, je n'ai aucun moyen de spécifier lequel des multiples scores dans le contenu_obj.score_sque je veux commander par. Aussi, puis-je clarifier ma question pour vous? Je veux m'assurer que c'est compréhensible par tout le monde
Bien sûr, il suffit de ré-éditer votre message et de modifier ce dont vous avez besoin. Désolé, j'ai peut-être mal compris toute la chose, ne serait pas ma première fois :(
Fait une petite modification au bas de l'objectif, mais malheureusement, je ne suis pas la façon dont comment signalera la question. Merci d'avoir essayé si Cesar!
Étant donné que Django Admin utilise le dB pour trier Vous ne pouvez pas trier sur la fonction que vous affichez dans la liste.
Ce que vous pouvez faire est d'ajouter la colonne que vous souhaitez afficher à la requête que Django admin utilise pour la liste. Vos modèles, de cette façon, vous pouvez avoir le tri. p>
Pour ajouter la colonne Vous devez utiliser la méthode supplémentaire de QuerySet. P>
Cela devrait faire le truc :) P> rond bonus: p> content.Object.all (). Extra (SELECT = {'TWITTER_SCORE': "Sélectionnez" Score Twitter: "|| Score de contenu_score Où content_score.id = content_content.id '}) p> p>
Il est certainement possible de le faire dans les domaines de l'ormes. J'ai trouvé une solution pour cela que je vais poster sous peu, je vais commenter ici quand j'ai :)
En fait, ce sera un peu de temps jusqu'à ce que je réponde, je ne suis pas autorisé à 8 heures!
@ djs22 je suis curieux de voir celui-ci :)
J'ai résolu cela en étendant la méthode code> get_queryset code> de la catégorie code> contentAdmin code>. Après cela, il s'agissait simplement d'obtenir la bonne requête Orm pour Django 1.5 et antérieure, la méthode était QuerySet code>. P> def queryset(self, request):
qs = super(ContentAdmin, self).queryset(request)
return qs.filter(score__name='Twitter').order_by('-score__score')
Par panneau d'administration, vous voulez dire
admin.py code>? Avez-vous unadmin.site.register (contenu, contentAdmin) code>?Mon code ne fait pas la commande, il affiche uniquement les scores
Oui, par panneau d'administration, je voulais dire admin.py. Il suffit de fixer cela aussi, j'ai tous les modèles enregistrés correctement.
Eh bien ça sonne mal mais avez-vous essayé de cliquer sur l'en-tête de la colonne pour faire le tri?
@Tommasobarbugli, j'aimerais que ce soit moi d'être si muet! Malheureusement, un clic sur une en-tête de colonne ne fonctionne pas pour les colonnes définies comme des fonctions.
@ DJS22 MEA CULPA Je ne payais pas assez d'attention à votre code :)
Posté ma réponse ici: Stackoverflow.com/a/10253503/309616 . Je vais le marquer comme correct une fois que je suis autorisé à faire ça!