2010-02-16 5 views
0

Je suis un débutant Django, alors s'il vous plaît pardonnez-moi si c'est une question stupide. J'ai un formulaire de recherche qui contient plusieurs champs. Je souhaite seulement filtrer mon jeu de requête par les champs soumis qui ne sont pas vides. Comment je fais ça? Je suis conscient que vous pouvez chaîner des ensembles de queries et des objets Q, mais je ne sais pas comment éliminer les paires clé/valeur vides de la chaîne. Je sais que ce qui suit ne fonctionne pas, mais je pensais que cela pourrait donner un aperçu de ce que je cherche. Je vous remercie.Django Newbie - Avec une forme de champs multiples, comment puis-je éliminer les champs vides dans le jeu de requête

def art_search(request): 
    if request.method == 'GET': 
     form = AdvSearch(request.GET) 
     if form.is_valid(): 
      art_name = form.cleaned_data['art_name'] 
      art_number = form.cleaned_data['art_number'] 
      artwork = Inventory.objects.filter(
       if art_name is not u'': 
        Q(marketingname=art_name), 
       if art_number is not u'': 
        Q(marketingnumber=art_number) 
      ) 
      return object_list(request, queryset=artwork) 
    else: 
     form = AdvSearch() 
    return render_to_response('art/search.html', { 
     'form': form, 
    }) 

Répondre

2

Vous pouvez écrire:

if form.is_valid(): 
    opts = {} 
    for key in form.cleaned_data: 
     if form.cleaned_data[key] != '': 
      opts[key] = form.cleaned_data[key] 
    artwork = Inventory.objects.filter(**opts) 
    return object_list(request, queryset=artwork) 

Si les paramètres de filtre ont les mêmes noms que les champs de formulaire.

0

Quelque chose simple que je trouve est de créer un dictionnaire comme:

query_dict = { 'marketingname' : art_name , 'marketingnumber'=art_number} 

Ensuite, l'exploitation syntaxe des kwargs de python pour passer en bien, soit

Inventory.objects.filter(**query_dict) 

Pour construire le dictionnaire initial, vous pouvez utiliser un liste compréhension si vos clés clean_data correspondent aux paramètres que vous passez à filter().

query_dict = dict([ (k,v) for k,v in form.cleaned_data.items() if v ]) 

Mais cela ne semble pas être le cas ici

+0

J'ai écrit la même chose ci-dessous en premier:/ –

+0

Ma réponse n'est pas complètement redondante. Il démontre la compréhension de la liste et dict(). Dziekuje :) – Koobz

0

vous pouvez essayer de faire (markettingname = artname!):

if art_name != '' and art_number != '': 
    artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number) 

encore mieux si vous utilisez essayer

try: 
    artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number) 
except: 
    # do some error handling 
0

cela devrait fonctionner:

Inventory.objects.filter (Q (marketingname = art_name) | Q (marketingnumber = art_number))

Questions connexes