2011-06-20 24 views
20

Ana görünüm, basit bir paginated ListView ve buna bir arama formu eklemek istiyorum. Django sınıf tabanlı görünüm Liste görünümü

bu işi halleder gibi bir şey düşündüm:

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

Ama görünüşe göre ben yanlış anladım .. ve ben resmi belgelerinde bunu nasıl bulamıyor.

Öneriler?

cevap

5

Uygun bir çözüm için de çalışıyordum. Ama hiçbir şey bulamadım ki kendi başıma gelmek zorundaydı. 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, **kwargs): 
    context = super(VocationsListView, self).get_context_data(**kwargs) 
    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 

nedenle temelde ben arama işlevi uygulamak istediğiniz her modeli sınıfına kod parçası ekleyin. Her model için filtreler

@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 

ben bu cevaplar beni yönlendirmek için çok yardımcı olmuş

26

modeli veri almak için kullanmak qset filtresi hazırlar açıkça hazır olmak zorunda olmasıdır doğru yön. Teşekkürler beyler.

Uygulamam için hem alın hem de yayınla bir ListView döndüren bir form görünümüne ihtiyacım vardı. Get işlevinin içeriğini tekrarlamaktan hoşlanmıyorum, ancak birkaç değişiklik gerekiyordu. Form şimdi get_queryset'ten şimdi de self.form ile kullanılabilir. Önceki yanıtlarından

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 
    # ... 
+0

Mükemmel! Sayfalama çalışmasını sürdürmek için miras emrini (ListView, FormMixin) değiştirmem gerekti. – laffuste

+0

Bu güzel ama tüm formları çıktılamak için şablonda kullanmam gerekenler. Modeller listesi olan ilk öğe ve nesneler listesi olan bir form örneğini görüyorum. –

+4

Şablon kodunu listeleyebilir misiniz lütfen? –

0

, burada ListView aynı sayfadaki formu görüntülemek için kullanılan görünümleri almak benim: Sonra

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('/') 

, son şey add_link bağlamaktır formun eylem URL'sine işlevi görüntülemek ve gitmek için iyi bir şey olduğunu düşünüyorum.

İlgili konular