2010-06-15 4 views
5

Je viens de commencer à jouer avec Django aujourd'hui et jusqu'à présent, je trouve qu'il est plutôt difficile de faire des choses simples. Ce à quoi je me bats en ce moment, c'est de filtrer une liste de types d'états. Le modèle StatusTypes est:Filtrer les résultats du modèle pour Django admin select box

class StatusTypes(models.Model): 
    status = models.CharField(max_length=50) 
    type = models.IntegerField() 
    def __unicode__(self): 
     return self.status 
    class Meta: 
     db_table = u'status_types' 

Dans une page d'admin j'ai besoin tous les résultats où type = 0 et dans un autre, je vais avoir besoin de tous les résultats où type = 1 donc je ne peux pas limiter juste à l'intérieur du modèle. Comment ferais-je cela?

EDIT: J'aurais dû être un peu plus clair. J'ai un modèle "Unit" qui a une clé étrangère à StatusTypes. Les modèles sont les suivants:

class StatusTypes(models.Model): 
    status = models.CharField(max_length=50) 
    type = models.IntegerField() 
    def __unicode__(self): 
     return self.status 
    class Meta: 
     db_table = u'status_types' 

class Unit(models.Model): 
    name = models.CharField(unique=True, max_length=50) 
    status = models.ForeignKey(StatusTypes, db_column='status') 
    note = models.TextField() 
    date_added = models.DateTimeField() 
    def __unicode__(self): 
     return self.name 
    class Meta: 
     db_table = u'units' 

Alors maintenant, dans la page d'administration pour le modèle de l'unité que je veux limiter le statut que ceux de type = 1. Sur la base de la réponse de lazerscience ci-dessous j'ai essayé le code suivant:

from inv.inventory.models import Unit 
from django.contrib import admin 

class UnitAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(UnitAdmin, self).queryset(request) 
     return qs.filter(type=0) 

admin.site.register(Unit, UnitAdmin) 

Mais, cela n'a pas du tout changé la case de sélection. J'ai également essayé d'imprimer la valeur de qs et rien n'a été sorti sur mon terminal, donc je me demande si je dois un peu comment appelez le jeu de requête?

EDIT 2: Il n'est peut-être pas clair que je souhaite filtrer cela pour la liste déroulante d'état qui se trouve sur la page de création du modèle d'unité.

Répondre

3

EDIT:

Il se avère que ModelAdmin.formfield_for_foreignkey était la bonne réponse dans cette situation: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

réponse précédente:

Jetez un oeil à la list_filter attribute of ModelAdmin. Cela ressemble plus à ce que vous voulez pour moi, car il va créer une interface agréable pour filtrer sur différents critères plutôt que de restreindre arbitrairement votre jeu de requête.

+0

Merci pour la réponse.List_filter ne fonctionnera pas car vous ne pouvez pas avoir une unité avec un statut de type = 0 et à moins que je ne me trompe, list_filter ajoute simplement une barre latérale donnant l'option à l'utilisateur. Je suis un peu surpris que ce soit si difficile à faire ... au moins, je n'ai pas encore trouvé de réponse. Tout ce que je veux essentiellement faire, c'est ajouter 'WHERE part = 1' à la requête. – blcArmadillo

+0

Peut-être que je manque le point sur ce que vous voulez, mais si vous ajoutez 'status' à la liste' list_filter', cela vous donnera un widget qui vous permet de filtrer en fonction des valeurs autorisées pour ce champ. Il fonctionne en ajoutant un paramètre get à l'URL d'administration, exactement comme vous le souhaitez. –

+0

Gabriel, je viens de réaliser ce que pourrait être la confusion. Je veux filtrer les types d'état pour le champ de sélection d'état sur la page d'ajout. Ne pas ajouter une colonne de filtre à la liste des unités qui ont déjà été ajoutées. Cela aide-t-il à clarifier les choses? – blcArmadillo

2

Vous pouvez remplacer la méthode queryset de votre MyModelAdmin classe:

from django.contrib import admin 

class MyModelAdmin(admin.ModelAdmin): 

    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(type=0) 

admin.site.register(StatusTypes, MyModelAdmin) 

Cet administrateur vous afficher uniquement les objets de votre modèle qui ont type=0!

+0

Merci pour l'aide. Après avoir répondu, j'ai réalisé que j'aurais dû donner plus d'informations dans la question car ce que je demandais n'était pas vraiment ce que je devais faire. J'ai essayé de modifier votre code pour répondre à mes besoins, ainsi que de rechercher quelques ressources sur un jeu de requêtes prioritaire. J'ai essayé d'imprimer la valeur de qs mais rien n'a été fourni à mon terminal. Dois-je en quelque sorte appeler Queryset? – blcArmadillo

+0

Vous devriez ensuite filtrer votre ensemble de requêtes comme suit: 'qs.filter (status__type = 0)'. À la fin, vous parlez d'une liste déroulante, que voulez-vous dire par là? Et oui, tant que vous avez quelque chose de sauvé, vous devriez voir quelque chose dans votre jeu de questions. Essayez 'python manage.py shell',' depuis myapp.models import Unit', 'Unit.objects.filter (status__type = 0)'; jouer avec ça un peu! –

+0

Merci pour l'aide. Je vais regarder dans ça. – blcArmadillo

Questions connexes