2017-07-19 4 views
0

Donc, fondamentalement, j'ai cette vue générique qui hérite de ListView et ce que je veux faire est de prendre une sorte d'argument (comme une chaîne ou "options"), puis filtrer mon modèle en fonction de ceux arguments.Django Generic Voir Model Filtering

J'ai regardé pendant deux jours et ne peux pas sembler trouver beaucoup à ce sujet. Je l'ai joué avec la fonction d'écraser get_queryset aussi juste essayé de filtrage directement comme ceci:

model = product.objects.filter(pk__in=[1,2,3,4,5]) 

Cependant, la plupart du temps, il me donne juste cette erreur:

/python3.5/site-packages/django/views/generic/list.py", line 38, in get_queryset 

    queryset = self.model._default_manager.all() 
AttributeError: 'QuerySet' object has no attribute '_default_manager' 

Je ne ai pas vraiment J'ai besoin d'une "solution", je serais très bien si quelqu'un pouvait simplement me montrer où je peux lire à propos de cela puisque je n'ai réussi à trouver une description de base.

Merci

+1

pouvez-vous ajouter plus de détails sur vos modèles? –

+3

qu'est-ce que le produit? Est-ce un nom de modèle ou de nom de variable. Il semble que le produit soit un nom de variable (assigné à un ensemble de requêtes) et dans ce cas il devrait être product.filter (pk__in = [1, 2, 3, 4, 5]) –

+0

produit est le nom du modèle, "from. models import product " – Bolian

Répondre

1

Essayez,

class YourView(ListView): 
    model = product 

    def get_queryset(self): 
     queryset = super(YourView, self).get_queryset() 
     #your condition here. 
     return queryset.filter(pk__in=[1,2,3]) 
+0

Je l'ai fait comme ça maintenant: def get_queryset (self, ** kwargs): return product.objects.filter (** kwargs) modèle = produit et il semble fonctionner, est-ce vraiment important de super (juste curius)? Aussi comment envoyer kwargs à une vue? comme un argument pour une chaîne de recherche ou est-il préférable d'utiliser simplement la méthode post? Merci de votre aide! (Edit: L'ident a été gâché dans ce commentaire, eh bien ...) – Bolian

+0

'super()' call ne charge que le jeu de requête par défaut. Il est juste classique d'appeler simplement la méthode de la classe parent, vous pouvez simplement l'ignorer, mais c'est en fait une bonne pratique. Ensuite, au sujet du passage de kwargs, vous pourriez écrire vos URL pour attraper un motif spécifique et l'utiliser comme kwarg, ce serait moche cependant. Mais, personnellement, je suggérerais d'écrire un gestionnaire personnalisé pour filtrer le jeu de requête (seulement si le filtrage selon certains kwarg est nécessaire). – zaidfazil

+0

Eh bien, fondamentalement, j'essaie de faire un magasin et l'utilisateur a la possibilité de saisir une chaîne de recherche ou de vérifier différentes catégories. Si c'était php, je suppose que je publierais tout, puis vérifiez simplement les valeurs qui ne sont pas alors créer une requête. J'ai décidé de jouer avec kwargs parce que je pensais que c'était plus facile + j'ai vu dans docs ce "filtre (** kwargs) .J'ai un peu envie de faire comme une commande unix où" ls "est la vue et" - "(tirets) sont des options ou dans ce cas le filtrage.Mais je ne suis pas sûr si c'est ainsi qu'ils l'ont implémenté ... Je pourrais juste devoir faire un poteau ou vérifier le thingy de gestionnaire de coutume. – Bolian

1

juste divisé en 2 lignes:

model = Product 

et

queryset = Product.objects.filter(pk__in=[1,2,3,4,5]) 

Il fonctionnera.

+0

Vérifiez votre classe de modèle, est-ce 'product' ou' Product' et aller avec ce nom. Conformément à la convention, nous utilisons 'CamelCase' pour la classe. –