WebHU - Programozási kérdések és válaszok

Django osztály alapú nézet ListView űrlappal

A fő nézet egy egyszerű oldalszámozott ListView, és szeretnék hozzáadni egy keresési űrlapot.

Arra gondoltam, hogy valami ilyesmi lesz a trükk:

class MyListView(ListView, FormView):
    form_class = MySearchForm
    success_url = 'my-sucess-url'
    model = MyModel
    # ...

De úgy tűnik, rosszul tettem, és nem találom, hogyan kell ezt megtenni a hivatalos dokumentációban.

Javaslatok?

20.06.2011

Válaszok:


1

Ezek a válaszok sokat segítettek abban, hogy a helyes irányba tereljenek. Köszönöm srácok.

A megvalósításhoz szükségem volt egy űrlapnézetre, amely egy ListView-t adott vissza mind a get, mind a post-on. Nem szeretem megismételni a get függvény tartalmát, de néhány változtatásra volt szükség. Az űrlap már elérhető a get_queryset webhelyről a self.form segítségével is.

from django.http import Http404
from django.utils.translation import ugettext as _
from django.views.generic.edit import FormMixin
from django.views.generic.list import ListView

class FormListView(FormMixin, ListView):
    def get(self, request, *args, **kwargs):
        # From ProcessFormMixin
        form_class = self.get_form_class()
        self.form = self.get_form(form_class)

        # From BaseListView
        self.object_list = self.get_queryset()
        allow_empty = self.get_allow_empty()
        if not allow_empty and len(self.object_list) == 0:
            raise Http404(_(u"Empty list and '%(class_name)s.allow_empty' is False.")
                          % {'class_name': self.__class__.__name__})

        context = self.get_context_data(object_list=self.object_list, form=self.form)
        return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
        return self.get(request, *args, **kwargs)


class MyListView(FormListView):
    form_class = MySearchForm
    model = MyModel
    # ...
24.02.2012
  • Tökéletes! Meg kellett cserélnem az öröklési sorrendet (ListView, FormMixin), hogy továbbra is működjön az oldalszámozás. 05.02.2014
  • Ez szép, de amit a sablonban kell használnom az összes űrlap megjelenítéséhez. Csak egy példányt látok az űrlapnak, amely az első elem, és az objects_list, amely a modelllista. 19.04.2015
  • Rendben, sikerült egy űrlapot és egy listát egy oldalon találnom, köszönöm. De hogyan tudom feldolgozni a keresést? Azt hiszem, felül kell bírálni a post(self, request, *args, **kwargs) elemet a MyListView-ban. De hogyan? Másolja ki a kódot a get-ből, és keressen ott? Néha az a benyomásom, hogy a LisView-k végül bonyolultabbá teszik a dolgokat, mint egy egyszerű nézet függvény írása. Vagy hiányzik valami? 04.07.2016

  • 2

    Én is kerestem a megfelelő megoldást. De nem találtam egyet sem, így elő kellett állnom a sajátommal.

    views.py

    class VocationsListView(ListView):
    
        context_object_name = "vocations"
        template_name = "vocations/vocations.html"
        paginate_by = 10
    
        def get_queryset(self):
            get = self.request.GET.copy()
            if(len(get)):
                get.pop('page')
            self.baseurl = urlencode(get)
            model = Vocation
            self.form = SearchForm(self.request.GET)
            filters = model.get_queryset(self.request.GET)
            if len(filters):
                model = model.objects.filter(filters)
            else:
                model = model.objects.all()
            return model
    
    
    
    def get_context_data(self):
        context = super(VocationsListView, self).get_context_data()
        context['form'] = self.form
        context['baseurl']= self.baseurl
        return context
    

    models.py

    class Vocation(models.Model):
        title = models.CharField(max_length = 255)
        intro = models.TextField()
        description = models.TextField(blank = True)
        date_created = models.DateTimeField(auto_now_add = True)
        date_modified = models.DateTimeField(auto_now = True)
        created_by = models.ForeignKey(User, related_name = "vocation_created")
        modified_by = models.ForeignKey(User, related_name = "vocation_modified")
    
        class Meta:
            db_table = "vocation"
    
        @property
        def slug(self):
            return defaultfilters.slugify(self.title)
    
        def __unicode__(self):
            return self.title
    
        @staticmethod
        def get_queryset(params):
    
            date_created = params.get('date_created')
            keyword = params.get('keyword')
            qset = Q(pk__gt = 0)
            if keyword:
                qset &= Q(title__icontains = keyword)
            if date_created:
                qset &= Q(date_created__gte = date_created)
            return qset
    

    így alapvetően minden modellosztályhoz hozzáadom ezt a kódrészletet, ahol a keresési funkciót szeretném megvalósítani. Ennek az az oka, hogy minden modellhez kifejezetten el kell készíteni a szűrőket

    @staticmethod
    def get_queryset(params):
    
        date_created = params.get('date_created')
        keyword = params.get('keyword')
        qset = Q(pk__gt = 0)
        if keyword:
            qset &= Q(title__icontains = keyword)
        if date_created
            qset &= Q(date_created__gte = date_created)
        return qset
    

    előkészíti a qset szűrőt, amivel lekérem az adatokat a modellből

    20.07.2011

    3

    A Django 2.2-ben ezt megteheti (legalábbis get-kérés esetén jól működik):

    from django.views.generic import ListView
    from django.views.generic.edit import FormMixin
    
    from .models import MyModel
    from .forms import MySearchForm
    
    class ListPageView(FormMixin, ListView):
        template_name = 'property_list.html'
        model = MyModel
        form_class = MySearchForm
        queryset = MyModel.objects.all()
    

    Használja a FormMixin jelet a ListView előtt. Ha a SearchForm-et egy TemplateView-ban szeretné használni, ezt megteheti:

    from django.views.generic.base import TemplateView
    from django.views.generic.edit import FormMixin
    
    from .models import MyModel
    from .forms import MySearchForm
    
    class HomePageView(FormMixin, TemplateView):
        template_name = 'home.html'
        form_class = MySearchForm
    
    21.11.2019

    4

    A korábbi válaszok alapján a következőképpen vélekedem azokról a nézetekről, amelyeket az űrlap megjelenítéséhez használtam a ListView-val azonos oldalon:

    class IndexView(FormMixin, ListView):
        ''' Homepage: displays list of links, and a form used to create them '''
        template_name = "links/index.html"
        context_object_name = "links"
        form_class = LinkForm
    
        def get_queryset(self):
            return Links.objects.all()
    
    def add_link(request):
        # Sole job of this function is to process the form when POSTed. 
        if request.method == "POST":
            form = LinkForm(request.POST)
    
            if form.is_valid():
                Links.objects.create(address=form.cleaned_data['address'])
    
            return HttpResponseRedirect('/')
    

    Utána az utolsó dolog az, hogy az add_link view függvényt az űrlap műveleti URL-jéhez kell kötni, és szerintem már mehet is.

    28.08.2017

    5

    Űrlapok index- és listanézetekhez mixinekkel történő hozzáadását a a hivatalos dokumentáció.

    A dokumentáció általában nem javasolja ezt a megközelítést. Azt javasolja, hogy ehelyett egyszerűen írjon egy kicsit több pythont, és kézzel kódolja a nézetet.

    29.05.2019
  • Érdemes megjegyezni, hogy azért ajánlják ellene, mert bonyolult, nem pedig a vele járó problémák miatt. Még példakódot is adnak erre, bár példájuk a (FormMixin, DetailView) alosztályozása, nem pedig a ListView. 30.09.2020
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..