2010-02-15 11 views
17

मैं Django फॉर्म का उपयोग POST के माध्यम से फ़िल्टर किए गए/पहचाने गए खोज करने के लिए कर रहा हूं, और मैं परिणामों को व्यवस्थित करने के लिए Django की पेजिनेटर कक्षा चाहता हूं। क्लाइंट को विभिन्न पृष्ठों के बीच पारित करते समय मैं मूल अनुरोध कैसे संरक्षित करूं? दूसरे शब्दों में, ऐसा लगता है कि जैसे ही मैं अपने विचारों पर किसी अन्य पृष्ठ के लिए GET अनुरोध पास करता हूं, मैं पोस्ट डेटा खो देता हूं। मैंने पेज के परिणाम ब्लॉक को रीफ्रेश करने के लिए AJAX का उपयोग करने के लिए कुछ अनुशंसाएं देखी हैं, लेकिन मुझे आश्चर्य है कि ऐसा करने के लिए एक Django- मूल तंत्र है या नहीं।एक Django रूपों के परिणामों को अंकन करना POST अनुरोध

धन्यवाद।

उत्तर

23

यदि आप बाद में अनुरोध में स्टोर डेटा तक पहुंचना चाहते हैं, तो आपको इसे कहीं स्टोर करना होगा। Django इस संग्रह करने के लिए कई तरीके प्रदान करता है:

1) आप sessions उपयोग कर सकते हैं क्वेरी स्टोर करने के लिए: हर आगंतुक आपकी साइट पर कौन एक खाली सत्र वस्तु मिल जाएगा और आप स्टोर कर सकते हैं इस वस्तु है, जो कार्य करता है के अंदर जो कुछ भी आप चाहते हैं एक ताना की तरह दोष: एक एकल आगंतुक एक साथ पेजिनेशन के साथ कई खोज नहीं कर सकता है।

2) कुकीज़ का उपयोग करें: यदि आप क्लाइंट पक्ष पर संग्रहीत कुकी सेट करते हैं, तो ब्राउज़र कुकी के डेटा को प्रत्येक अनुरोध पर जोड़ देगा जहां आप इसे एक्सेस कर सकते हैं। कुकीज अधिक सर्वर अनुकूल हैं, क्योंकि आपको सर्वर पर उनके लिए सत्र प्रबंधक की आवश्यकता नहीं है, लेकिन कुकीज़ में संग्रहीत डेटा क्लाइंट को दृश्यमान (और संपादन योग्य) है। दोष: पहले जैसा ही है।

3) छिपे हुए फ़ील्ड का उपयोग करें: आप अपने खोज-परिणाम पृष्ठ पर कुछ छिपे हुए फ़ील्ड के साथ एक फॉर्म जोड़ सकते हैं और क्वेरी को उनके अंदर संग्रहीत कर सकते हैं। फिर, जब भी आप फॉर्म जमा करते हैं तो ग्राहक क्वेरी भेज देगा। दोष: आपको अपने पृष्ठ पर पेजिनेशन के लिए सबमिट बटन के साथ एक फॉर्म का उपयोग करना होगा (सरल लिंक काम नहीं करेंगे)।

4) क्वेरी बनाएं जिसमें क्वेरी शामिल है: पोस्ट का उपयोग करने के बजाय, आप भी GET का उपयोग कर सकते हैं। उदाहरण के लिए, आपके पास "/search/hello+world/?order=votes" और "पेजिनेटेड लिंक" जैसे "/search/hello+world/2/?order-votes" जैसे लिंक हो सकते हैं। फिर क्वेरी को यूआरएल से आसानी से पुनर्प्राप्त किया जा सकता है। दोष: जीईटी के माध्यम से आप जो अधिकतम डेटा भेज सकते हैं वह सीमित है (लेकिन यह एक साधारण खोज के लिए कोई समस्या नहीं होनी चाहिए)।

5) एक संयोजन का उपयोग करें: आप एक सत्र या एक डेटाबेस में सभी डेटा स्टोर और एक जनरेट की गई कुंजी है जो आप URL में डाल सकते हैं से उन तक पहुँच सकते हैं। यूआरएल तब "/search/029af239ccd23/2" (दूसरे पृष्ठ के लिए) जैसा दिख सकता है और आप पहले से संग्रहीत डेटा की एक बड़ी मात्रा तक पहुंचने के लिए कुंजी का उपयोग कर सकते हैं। यह समाधान 1 के साथ-साथ समाधान 4 की कमी को समाप्त करता है। नई कमी: ज्यादा काम :)

6) AJAX का उपयोग करें: ajax के साथ आप क्लाइंट की तरफ कुछ js-चर, जो तब अन्य अनुरोधों के लिए पारित कर सकते हैं अंदर डेटा स्टोर कर सकते हैं और अजाक्स के बाद से ही अपने परिणाम सूची अद्यतन करेगा। , चर खो नहीं रहे हैं।

+0

धन्यवाद, यह सहायक है। इस सवाल को थोड़ा और अनपैक करने के लिए: क्या यह पेजिनेटर वर्ग के लिए इच्छित उपयोग है? मेरा दृश्य प्रारंभिक खोज फ़ॉर्म को संसाधित करता है, फिर टेम्पलेट को पहले पृष्ठ के लिए paginator.page() ऑब्जेक्ट भेजता है। परिणाम सूची उस पृष्ठ के ऑब्जेक्ट_सूची से उत्पन्न होती है। यह अजीब लगता है कि मैं इसे पूरे खोज परिणाम सेट नहीं भेज सका, और किसी भी तरह से पेज को प्रत्येक पृष्ठ के लिए खोज को पुनः सबमिट किए बिना। यदि कक्षा के लिए यह इच्छित उपयोग है, तो मैं इसके साथ काम कर सकता हूं। बस यह सुनिश्चित करना चाहते हैं कि मुझे कुछ स्पष्ट याद आ रही है। धन्यवाद! – andyashton

+1

हां, यह इच्छित उपयोग है। यह मत भूलना कि Django एक वेब ढांचा है, और उनके प्रकृति वेब अनुरोधों से राज्यिक नहीं हैं। तो यदि आप राज्य रखना चाहते हैं, तो आपको इसे कहीं भी स्टोर करना होगा - और tux21b ने आपको कुछ विकल्प दिए हैं। –

+0

बहुत उपयोगी, दोनों धन्यवाद। – andyashton

0

यदि आप AJAX है, तो कृपया अनुरोध ऑब्जेक्ट से पूछ सकते हैं, बस request.is_ajax। इस तरह आप पता लगा सकते हैं कि क्या यह अगला पोस्ट अनुरोध है या अगले पृष्ठों के बारे में और प्रश्न हैं।

0

खोज फ़ॉर्म और परिणाम एक एकल django टेम्पलेट पर प्रदर्शित होते हैं। प्रारंभ में, परिणाम प्रदर्शन क्षेत्र को छुपाने के लिए सीएसएस का उपयोग करें। फॉर्म पोस्ट करने पर, आप यह देखने के लिए जांच सकते हैं कि क्या खोज ने कोई परिणाम और हाय वापस कर दिया यदि परिणाम मौजूद हैं तो सीएसएस के साथ खोज फ़ॉर्म डी। यदि परिणाम मौजूद नहीं हैं, तो परिणाम प्रदर्शन क्षेत्र को पहले छिपाने के लिए सीएसएस का उपयोग करें।अपने पेजिनेशन लिंक में, फॉर्म सबमिट करने के लिए जावास्क्रिप्ट का उपयोग करें, यह document.forms[0].submit(); return false;

जितना आसान हो सकता है आपको पेज नंबर को डीजेंगो के पेजिंग इंजन में कैसे पास करना है, इसे संभालने की आवश्यकता होगी।

4

tux21b से बहुत अच्छा जवाब पढ़ना मैंने क्वेरी को संग्रहीत करने के लिए सत्र का उपयोग करने के लिए पहले विकल्प को लागू करने का निर्णय लिया, यानी। यह एक ऐसा एप्लिकेशन है जो अचल संपत्ति डेटाबेस खोजता है। यहां व्यू कोड है (django 1.5 का उपयोग करके):

def main_search(request): 
    search_form = UserSearchForm() 
    return render(request, 'search/busca_inicial.html', {'search_form': search_form}) 


def result(request): 
    if request.method == 'POST': 
     search_form = UserSearchForm(request.POST) 
     if search_form.is_valid(): 
      # Loads the values entered by the user on the form. The first and the second 
      # are MultiChoiceFields. The third and fourth are Integer fields 
      location_query_list = search_form.cleaned_data['location'] 
      realty_type_query_list = search_form.cleaned_data['realty_type'] 
      price_min = search_form.cleaned_data['price_min'] 
      price_max = search_form.cleaned_data['price_max'] 
      # Those ifs here populate the fields with convenient values if the user 
      # left them blank. Basically the idea is to populate them with values 
      # that correspond to the broadest search possible. 
      if location_query_list == []: 
       location_query_list = [l for l in range(483)] 
      if realty_type_query_list == []: 
       realty_type_query_list = [r for r in range(20)] 
      if price_min == None: 
       price_min = 0 
      if price_max == None: 
       price_max = 100000000 
      # Saving the search parameters on the session 
      request.session['location_query_list'] = location_query_list 
      request.session['price_min'] = price_min 
      request.session['price_max'] = price_max 
      request.session['realty_type_query_lyst'] = realty_type_query_list 
    # making a query outside the if method == POST. This logic makes the pagination  possible. 
    # If the user has made a new search, the session values would be updated. If not, 
    # the session values will be from the former search. Of course, that is what we want because 
    # we want the 'next' and 'previous' pages correspond to the original search 
    realty_list_result = FctRealtyOffer.objects.filter(location__in=request.session['location_query_list'] 
                ).filter(price__range=(request.session['price_min'], request.session['price_max']) 
                ).filter(realty_type__in=request.session['realty_type_query_lyst']) 
    # Here we pass the list to a table created using django-tables2 that handles sorting 
    # and pagination for us 
    table = FctRealtyOfferTable(realty_list_result) 
    # django-tables2 pagination configuration 
    RequestConfig(request, paginate={'per_page': 10}).configure(table) 

    return render(request, 'search/search_result.html', {'realty_list_size': len(realty_list_result), 
                 'table': table}) 

आशा है कि इससे मदद मिलती है! अगर किसी को सुझाव देने में कोई सुधार है, तो आपका स्वागत है।

4

@rvnovaes के रूप में, इस मामले को हल करने के लिए सत्र का उपयोग करने का एक तरीका।

उनके समाधान की कमी यह है कि यदि कई खोज फ़ील्ड हैं तो आपको कोड की कई पंक्तियां लिखनी होंगी, और यदि आप परिणाम पृष्ठ में खोज फ़ॉर्म दिखाते हैं, तो सभी फ़ील्ड खाली रहेंगे, जबकि उन्हें रखना चाहिए उनके मूल्य

तो मैं नहीं बल्कि सत्र में सभी पद डेटा को बचाने के चाहते हैं, और यदि कोई सत्र परिभाषित किया गया है दृश्य की शुरुआत में request.POST और request.method का मूल्य मजबूर:

""" ... """ 
if not request.method == 'POST': 
    if 'search-persons-post' in request.session: 
     request.POST = request.session['search-persons-post'] 
     request.method = 'POST' 

if request.method == 'POST': 
    form = PersonForm(request.POST) 
    request.session['search-persons-post'] = request.POST 
    if form.is_valid(): 
     id = form.cleaned_data['id'] 
""" ... """ 

और जानकारी here

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