Django-fr

Forum

#1 30-07-2012 18:54:19

dgi
Membre
Inscription : 14-03-2012
Messages : 7

ListView et recherche

Bonjour

Actuellement pour afficher une liste de résultat, j'utilise un premier template qui m'affiche mes critères puis lorsque je submit le formulaire, j'appelle  une fonction search dans laquelle je construit ma requete et j'appelle ensuite render_to_response pour afficher le template avec la liste filtrer.

J'aimerais maintenant utiliser une listview pour afficher mes résultats mais je ne trouve pas comment passer mes critères de recherches de ma fonction search vers la méthode get_queryset de ma list view.

Il y a bien la methode reverse('on_url_nommée',kwargs) mais cela m'oblige  à construire le kwargs et à modifier l'urls.py. Pas très pratique surtout si on a de nombreux critères

Y a t-il une méthode plus propre ?

La solution serait de mettre de faire un seul template search et list comme cela dans get_queryset de ma list view j'ai directement acces à self.request.GET ?


Merci de votre aide

Hors ligne

#2 30-07-2012 22:14:25

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : ListView et recherche

Après un an de mise en prod de vue générique sous forme de classe, je
déconseille fortement leur utilisateur. Leur complexité à la
maintenance annule complètement tout autre bénéfice: utilisez plutôt
les vues génériques sous forme de fonctions.

Si vous souhaitez quand même utiliser ListView, la solution est de :

- overrider get_context_data
- avant d'appeler la méthode parente, récupérer les paramètres dans
self.kwargs et faites votre query que vous stockez dans
self.custom_query
- depuis get_queryset, récupérer self.custom_query
- appeler super sur get_context_data

On peut même aller plus loin en utilisant un formmixin avec une list
view comme ici:

http://stackoverflow.com/a/9423819/9951

Hors ligne

#3 31-07-2012 07:29:49

dgi
Membre
Inscription : 14-03-2012
Messages : 7

Re : ListView et recherche

Merci mais j'ai du mal à comprendre : je n'ai rien dans self.kwargs


Voila ce que je fait :

1) ma fonction de recherche
def notes_search(request):
    if request.method == "POST":
        form= NotesSearchForm(request.POST)
        if form.is_valid():
            search_q={}           
            if request.POST.has_key('title') and request.POST['title']:               
                search_q['title__icontains']=request.POST['title']               
                           
            if request.POST.has_key('notetype') and request.POST['notetype']:           
                search_q['notetype']=request.POST['notetype']
               
               return HttpResponseRedirect(reverse('notes_list'))           
    else:
           results = Notes.objects.none           
           form = NotesSearchForm()

    return render_to_response ("notes/search.html", {"form" : form, "results": results}, context_instance=RequestContext(request))


Ma listview:
class NotesListView(ListView):
    queryset = Notes.objects.all()
    template_name = "notes/list.html"
    context_object_name = 'note_list'
    paginate_by = 10
   

    def get_queryset(self):
         return self.queryset.filter()
   
    def get_context_data(self, **kwargs):
        context = super(NotesListView, self).get_context_data(**kwargs)         
        return context


dans self.kwargs de get_context_data (ou  self.kwargs de get_queryset) : je ne récupère pas mes request.POST de ma fonction search si bien que je ne peux pas filtrer ?

Hors ligne

#4 31-07-2012 09:30:57

Jean-mathieu Grimaldi
Membre
Inscription : 12-10-2010
Messages : 17

Re : ListView et recherche

Hello

pourquoi utiliser deux vues ?

une sous forme de classe et l'autre sous forme de fonction.

Utilisez la même vue et faites une méthode post à l'intérieur qui vous
retournera les résultats, plus simple à écrire qu'une fonction
indépendante testant le request.post

Pour apprendre, le mieux est de lire le code de Django, regardez
comment sont faites les classes de vues (dossier views), c'est très
simple à utiliser et très facilement extensible, la lecture et
compréhension prend une heure maximum, le code en lui-même contient
tous les exemples possibles.

Jean-mat

2012/7/31 dgi <gislarddavid _AT_ yahoo.fr>:
> Merci mais j'ai du mal à comprendre : je n'ai rien dans self.kwargs
>
>
> Voila ce que je fait :
>
> 1) ma fonction de recherche
> def notes_search(request):
>     if request.method == "POST":
>         form= NotesSearchForm(request.POST)
>         if form.is_valid():
>             search_q={}
>             if request.POST.has_key('title') and request.POST['title']:
>
>                 search_q['title__icontains']=request.POST['title']
>
>
>             if request.POST.has_key('notetype') and
> request.POST['notetype']:
>                 search_q['notetype']=request.POST['notetype']
>
>                return HttpResponseRedirect(reverse('notes_list'))
>
>     else:
>            results = Notes.objects.none
>            form = NotesSearchForm()
>
>     return render_to_response ("notes/search.html", {"form" : form,
> "results": results}, context_instance=RequestContext(request))
>
>
> Ma listview:
> class NotesListView(ListView):
>     queryset = Notes.objects.all()
>     template_name = "notes/list.html"
>     context_object_name = 'note_list'
>     paginate_by = 10
>
>
>     def get_queryset(self):
>          return self.queryset.filter()
>
>     def get_context_data(self, **kwargs):
>         context = super(NotesListView, self).get_context_data(**kwargs)
>
>         return context
>
>
> dans self.kwargs de get_context_data (ou  self.kwargs de get_queryset) :
> je ne récupère pas mes request.POST de ma fonction search si bien que je
> ne peux pas filtrer ?
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#5 31-07-2012 12:15:17

ksamuel
Modérateur
Inscription : 22-06-2012
Messages : 40
Site Web

Re : ListView et recherche

Le mar. 31 juil. 2012 10:30:57 CEST, Jean-mathieu Grimaldi a écrit :
> Hello
>
> pourquoi utiliser deux vues ?
>
> une sous forme de classe et l'autre sous forme de fonction.
>
> Utilisez la même vue et faites une méthode post à l'intérieur qui vous
> retournera les résultats, plus simple à écrire qu'une fonction
> indépendante testant le request.post
>
> Pour apprendre, le mieux est de lire le code de Django, regardez
> comment sont faites les classes de vues (dossier views), c'est très
> simple à utiliser et très facilement extensible, la lecture et
> compréhension prend une heure maximum, le code en lui-même contient
> tous les exemples possibles.
>
> Jean-mat
>
> 2012/7/31 dgi <gislarddavid _AT_ yahoo.fr>:
>> Merci mais j'ai du mal à comprendre : je n'ai rien dans self.kwargs
>>
>>
>> Voila ce que je fait :
>>
>> 1) ma fonction de recherche
>> def notes_search(request):
>>     if request.method == "POST":
>>         form= NotesSearchForm(request.POST)
>>         if form.is_valid():
>>             search_q={}
>>             if request.POST.has_key('title') and request.POST['title']:
>>
>>                 search_q['title__icontains']=request.POST['title']
>>
>>
>>             if request.POST.has_key('notetype') and
>> request.POST['notetype']:
>>                 search_q['notetype']=request.POST['notetype']
>>
>>                return HttpResponseRedirect(reverse('notes_list'))
>>
>>     else:
>>            results = Notes.objects.none
>>            form = NotesSearchForm()
>>
>>     return render_to_response ("notes/search.html", {"form" : form,
>> "results": results}, context_instance=RequestContext(request))
>>
>>
>> Ma listview:
>> class NotesListView(ListView):
>>     queryset = Notes.objects.all()
>>     template_name = "notes/list.html"
>>     context_object_name = 'note_list'
>>     paginate_by = 10
>>
+1. N'utilisez qu'une seule vue.

>>
>>     def get_queryset(self):
>>          return self.queryset.filter()
>>
>>     def get_context_data(self, **kwargs):
>>         context = super(NotesListView, self).get_context_data(**kwargs)
>>
>>         return context
>>
>>
>> dans self.kwargs de get_context_data (ou  self.kwargs de get_queryset) :
>> je ne récupère pas mes request.POST de ma fonction search si bien que je
>> ne peux pas filtrer ?
>> _______________________________________________
>> django mailing list
>> django _AT_ lists.afpy.org
>> http://lists.afpy.org/mailman/listinfo/django
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#6 31-07-2012 14:01:55

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : ListView et recherche

Salut,

Il y a une Class Based Views "ListAppendView" [1] dans une version de django-
braces qui mixe la CBV de liste d'objet et un formulaire, ça peut peut-être te
servir comme exemple.

[1] : https://github.com/sveetch/django-
braces/blob/master/braces/views.py#L228

Hors ligne

#7 01-08-2012 13:03:21

dgi
Membre
Inscription : 14-03-2012
Messages : 7

Re : ListView et recherche

merci
Je vais fouiller tout cela

Hors ligne

Pied de page des forums