Django: कक्षा आधारित सूची दृश्य में खोज फ़ॉर्म




forms listview (4)

खैर, मुझे लगता है कि फॉर्म के सत्यापन को छोड़ना अच्छा विचार है। शायद इस विशेष मामले में इसके लायक नहीं है, क्योंकि यह बहुत ही सरल रूप है - लेकिन निश्चित रूप से अधिक जटिल (और शायद आपका भी बढ़ेगा) के साथ, इसलिए मैं कुछ ऐसा करूंगा:

class ProfileList(ListView):
    model = Profile
    form_class = ProfileSearchForm
    context_object_name = 'profiles'
    template_name = 'pages/profile/list_profiles.html'
    profiles = []


    def get_queryset(self):
        form = self.form_class(self.request.GET)
        if form.is_valid():
            return Profile.objects.filter(name__icontains=form.cleaned_data['name'])
        return Profile.objects.all()

मैं Class Based ListView का एहसास करने की कोशिश कर रहा हूं जो एक टेबल सेट का चयन प्रदर्शित करता है। यदि साइट से पहली बार अनुरोध किया जाता है, तो डेटासेट प्रदर्शित किया जाना चाहिए। मैं एक पोस्ट सबमिशन पसंद करूंगा, लेकिन जीईटी भी ठीक है।

यह एक समस्या है, जो function based views साथ संभालना आसान था, हालांकि कक्षा आधारित विचारों के साथ मुझे अपने सिर को पाने के लिए कठिन समय है।

मेरी समस्या यह है कि मुझे विभिन्न प्रकार की त्रुटि मिलती है, जो वर्गीकृत विचारों की मेरी सीमित समझ के कारण होती है। मैंने विभिन्न दस्तावेज पढ़ लिए हैं और मैं प्रत्यक्ष क्वेरी अनुरोधों के लिए विचारों को समझता हूं, लेकिन जैसे ही मैं क्वेरी कथन में एक फॉर्म जोड़ना चाहता हूं, मैं अलग-अलग त्रुटि में भाग लेता हूं। नीचे दिए गए कोड के लिए, मुझे ValueError: Cannot use None as a query value प्राप्त होता है ValueError: Cannot use None as a query value

फ़ॉर्म प्रविष्टियों (अन्यथा संपूर्ण डेटाबेस का चयन) के आधार पर कक्षा आधारित ListView के लिए सबसे अच्छा अभ्यास कार्य प्रवाह क्या होगा?

यह मेरा नमूना कोड है:

models.py

class Profile(models.Model):
    name = models.CharField(_('Name'), max_length=255)

    def __unicode__(self):
        return '%name' % {'name': self.name}

    @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

forms.py

class ProfileSearchForm(forms.Form):
    name = forms.CharField(required=False)

views.py

class ProfileList(ListView):
    model = Profile
    form_class = ProfileSearchForm
    context_object_name = 'profiles'
    template_name = 'pages/profile/list_profiles.html'
    profiles = []


    def post(self, request, *args, **kwargs):
        self.show_results = False
        self.object_list = self.get_queryset()
        form = form_class(self.request.POST or None)
        if form.is_valid():
            self.show_results = True
            self.profiles = Profile.objects.filter(name__icontains=form.cleaned_data['name'])
        else:
            self.profiles = Profile.objects.all()
        return self.render_to_response(self.get_context_data(object_list=self.object_list, form=form))

    def get_context_data(self, **kwargs):
        context = super(ProfileList, self).get_context_data(**kwargs)
        if not self.profiles:
            self.profiles = Profile.objects.all()
        context.update({
            'profiles': self.profiles
        })
        return context

नीचे मैंने एफबीवी जोड़ा जो नौकरी करता है। मैं इस कार्यक्षमता को सीबीवी में कैसे अनुवाद कर सकता हूं? यह फ़ंक्शन आधारित विचारों में इतना आसान प्रतीत होता है, लेकिन वर्ग आधारित विचारों में नहीं।

def list_profiles(request):
    form_class = ProfileSearchForm
    model = Profile
    template_name = 'pages/profile/list_profiles.html'
    paginate_by = 10

    form = form_class(request.POST or None)
    if form.is_valid():
        profile_list = model.objects.filter(name__icontains=form.cleaned_data['name'])
    else:
        profile_list = model.objects.all()

    paginator = Paginator(profile_list, 10) # Show 10 contacts per page
    page = request.GET.get('page')
    try:
        profiles = paginator.page(page)
    except PageNotAnInteger:
        profiles = paginator.page(1)
    except EmptyPage:
        profiles = paginator.page(paginator.num_pages)

    return render_to_response(template_name, 
            {'form': form, 'profiles': suppliers,}, 
            context_instance=RequestContext(request))

मुझे लगता है कि आप get_context_data के माध्यम से ऐसा करने से बेहतर होगा। मैन्युअल रूप से अपना HTML फॉर्म बनाएं और इस डेटा को पुनर्प्राप्त करने के लिए GET का उपयोग करें। मैंने जो कुछ लिखा है उसका एक उदाहरण नीचे है। जब आप फॉर्म जमा करते हैं, तो आप संदर्भ डेटा के माध्यम से वापस जाने के लिए डेटा प्राप्त कर सकते हैं। यह उदाहरण आपके अनुरोध के अनुरूप नहीं है, लेकिन इसे अन्य उपयोगकर्ताओं की सहायता करनी चाहिए।

def get_context_data(self, **kwargs):
    context = super(Search, self).get_context_data(**kwargs)
    filter_set = Gauges.objects.all()
    if self.request.GET.get('gauge_id'):
        gauge_id = self.request.GET.get('gauge_id')
        filter_set = filter_set.filter(gauge_id=gauge_id)

    if self.request.GET.get('type'):
        type = self.request.GET.get('type')
        filter_set = filter_set.filter(type=type)

    if self.request.GET.get('location'):
        location = self.request.GET.get('location')
        filter_set = filter_set.filter(location=location)

    if self.request.GET.get('calibrator'):
        calibrator = self.request.GET.get('calibrator')
        filter_set = filter_set.filter(calibrator=calibrator)

    if self.request.GET.get('next_cal_date'):
        next_cal_date = self.request.GET.get('next_cal_date')
        filter_set = filter_set.filter(next_cal_date__lte=next_cal_date)

    context['gauges'] = filter_set
    context['title'] = "Gauges "
    context['types'] = Gauge_Types.objects.all()
    context['locations'] = Locations.objects.all()
    context['calibrators'] = Calibrator.objects.all()
    # And so on for more models
    return context

मुझे लगता है कि आपको जो त्रुटि मिल रही है वह है क्योंकि आपके फॉर्म को नाम फ़ील्ड की आवश्यकता नहीं है। इसलिए, हालांकि फॉर्म मान्य है, आपके name फ़ील्ड के लिए cleaned_data खाली है।

ये समस्याग्रस्त रेखाएं हो सकती हैं:

if form.is_valid():
    self.show_results = True
    self.profiles = Profile.objects.filter(name__icontains=form.cleaned_data['name'])

अगर मैं आप थे, तो मैं लाइन को बदलने की कोशिश करता हूं:

self.profiles = Profile.objects.filter(name__icontains=form.cleaned_data['name'])

इसके लिए:

self.profiles = Profile.objects.none()

यदि आप त्रुटियां प्राप्त करना बंद कर देते हैं (और आपका टेम्पलेट खाली object_list प्राप्त करता है), तो आपके पास जो समस्या है वह मैंने पहले कहा था: नाम फ़ील्ड आवश्यक नहीं है।

अगर यह काम नहीं करता है तो हमें बताएं!


मॉडल में सभी क्षेत्रों में खोजें

class SearchListView(ItemsListView):

# Display a Model List page filtered by the search query.

def get_queryset(self):
    fields = [m.name for m in super(SearchListView, self).model._meta.fields]
    result = super(SearchListView, self).get_queryset()
    query = self.request.GET.get('q')
    if query:
        result = result.filter(
            reduce(lambda x, y: x | Q(**{"{}__icontains".format(y): query}), fields, Q())
        )
    return result




class-based-views