2011-06-20 7 views
20

मुख्य दृश्य एक साधारण पृष्ठांकित सूची दृश्य है और मैं इसमें एक खोज फ़ॉर्म जोड़ना चाहता हूं।डीजेगो क्लास आधारित व्यू ListView फॉर्म

मैं कुछ इस तरह चाल करना होगा सोचा:

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

लेकिन जाहिरा तौर पर मैं गलत समझ में आ गया .. और मैं कैसे आधिकारिक दस्तावेज में यह करने के लिए नहीं मिल रहा।

सुझाव?

उत्तर

5

मैं भी एक उचित समाधान के लिए सीच कर रहा हूं। लेकिन ऐसा कोई नहीं मिला जो मुझे अपने साथ आना पड़ा। 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 

तो बुनियादी तौर पर मैं हर मॉडल वर्ग है, जहां मैं खोज की कार्यक्षमता को लागू करना चाहते हैं कोड के इस टुकड़े जोड़ें। इसका कारण यह है कि हर मॉडल के लिए फिल्टर स्पष्ट रूप से तैयार रहने की

@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 

यह है कि मैं मॉडल

26

ये जवाब तो मेरे में चलाने के लिए काफी मदद की है से डेटा पुनः प्राप्त करने के लिए उपयोग qset फिल्टर तैयार करता है सही दिशा। धन्यवाद दोस्तों

मेरे कार्यान्वयन के लिए मुझे एक फॉर्म दृश्य की आवश्यकता थी जो प्राप्त और पोस्ट दोनों पर एक सूची दृश्य लौटा। मुझे फ़ंक्शन प्राप्त करने की सामग्री को दोहराना पसंद नहीं है लेकिन इसे कुछ बदलावों की आवश्यकता है। फॉर्म अब get_queryset से self.form के साथ भी उपलब्ध है।

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

बिल्कुल सही! पेजिनेशन काम करने के लिए मुझे विरासत आदेश (सूची दृश्य, फॉर्ममिक्सिन) को स्वैप करना पड़ा। – laffuste

+0

यह अच्छा है लेकिन सभी रूपों को आउटपुट करने के लिए मुझे टेम्पलेट में क्या उपयोग करना चाहिए। मुझे फॉर्म का केवल एक उदाहरण दिखाई देता है जो कि पहला तत्व और ऑब्जेक्ट_लिस्ट है जो मॉडल सूची है। –

+4

क्या आप टेम्पलेट कोड सूचीबद्ध कर सकते हैं? –

0

पिछले जवाब से, यहां विचारों मैं आदेश ListView के रूप में एक ही पृष्ठ पर प्रपत्र प्रदर्शित करने के लिए में इस्तेमाल किया पर मेरी ले है: तो फिर

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

, आखिरी बात add_link बाध्य करने के लिए है फ़ॉर्म के एक्शन यूआरएल में फ़ंक्शन देखें, और मुझे लगता है कि आप जाने के लिए अच्छे हैं।

संबंधित मुद्दे