2009-12-10 18 views
8

Django नौसिखिया सवाल का प्रारंभिक मूल्य दर्रा ....एक Django फॉर्म फील्ड

मैं एक खोज फॉर्म लिख सकते हैं और खोज अनुरोध और खोज परिणामों के बीच इनपुट बॉक्स के राज्य बनाए रखने के लिए कोशिश कर रहा हूँ।

यहाँ मेरी प्रपत्र है:

class SearchForm(forms.Form): 
    q = forms.CharField(label='Search: ', max_length=50) 

और यहाँ मेरे विचार कोड है:

def search(request, q=""): 
    if (q != ""): 
     q = q.strip() 
     form = SearchForm(initial=q) 
     #get results here... 
     return render_to_response('things/search_results.html', 
      {'things': things, 'form': form, 'query': q}) 
    elif (request.method == 'POST'): # If the form has been submitted 
     form = SearchForm(request.POST) 
     if form.is_valid(): 
      q = form.cleaned_data['q'] 
      # Process the data in form.cleaned_data 
      return HttpResponseRedirect('/things/search/%s/' % q) # Redirect after POST 
     else: 
      form = SearchForm() 
      return render_to_response('things/search.html', { 
      'form': form, 
      }) 
    else: 
     form = SearchForm() 
     return render_to_response('things/search.html', { 
      'form': form, 
     }) 

लेकिन यह मुझे त्रुटि देता है:

Caught an exception while rendering: 'unicode' object has no attribute 'get' 

मैं प्रारंभिक मूल्य कैसे पारित कर सकते हैं? मैंने कोशिश की कई चीजें अनुरोध में हस्तक्षेप करने लगती हैं। POST पैरामीटर।

उत्तर

9

कई चीज़ें यहाँ अच्छा नहीं कर रहे हैं ...

1) एक पोस्ट के बाद सिफारिश की बात पुनर्निर्देशित करना होता है। यह कुख्यात पॉपअप से बचाता है कि बैक बटन का उपयोग करते समय आप फ़ॉर्म को पुनः सबमिट कर रहे हैं।

2) आपको if request.method == 'POST', if request.POST कहने की आवश्यकता नहीं है। इससे आपका कोड पढ़ने में आसान हो जाता है।

def myview(request): 
    # Some set up operations 
    if request.POST: 
     form=MyForm(request.POST) 
     if form.is_valid(): 
      # some other operations and model save if any 
      # redirect to results page 
    form=MyForm() 
    #render your form template 

है कि कहने के लिए नहीं है कि वहाँ बहुत सरल और अधिक जटिल विचारों नहीं किया जा सकता:

3) दृश्य आम तौर पर तरह दिखता है। लेकिन यह एक दृश्य का सारांश है: अगर अनुरोध पोस्ट प्रक्रिया है और रीडायरेक्ट; अगर अनुरोध फॉर्म प्रस्तुत किया जाता है।

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

मैं वास्तव में particular the tutorial. में django दस्तावेज़ीकरण की अनुशंसा करता हूं, लेकिन Django Book भी बहुत अच्छा है।

सब ने कहा, मुझे लगता है कि आप की तरह कुछ हैं:

def search(request, q=None): 
    if request.POST: 
     form = SearchForm(request.POST) 
     if form.is_valid(): 
      q = form.cleaned_data['q'] 
      url=reverse('search_results', args=(q,)) 
      return HttpResponseRedirect(url) 
    if q is None: 
     form = SearchForm() 
    else: 
     form = SearchForm(initial={'q': q}) 
    return render_to_response('things/search.html', { 
     'form': form, 
    }) 

सूचना है कि पैरामीटर प्रारंभिक आपके प्रपत्र के क्षेत्र मूल्यों की एक dict है।

उम्मीद है कि मदद करता है।

+2

त्रुटि की वजह से एक dict के बजाय एक यूनिकोड वस्तु पारित करने के लिए है। (dict '' get() 'को परिभाषित करता है, लेकिन स्ट्रिंग/यूनिकोड नहीं करता है)। – spookylukey

+0

आह, उत्कृष्ट बिंदु। मैंने त्रुटि देखी लेकिन कनेक्शन नहीं बनाया! – cethegeek

+0

विस्तृत टिप्पणियों और समाधान के लिए धन्यवाद। मैं इसे इस तरह कार्यान्वित कर दूंगा क्योंकि मैं चाहता था कि परिणाम यूआरएल/खोज/क्वेरी जैसा दिखें (मुझे पता है कि इसमें समस्याएं हैं, हालांकि, और इसे अच्छी तरह से संशोधित कर सकते हैं)। मैं पोस्ट के बाद रीडायरेक्ट करता हूं, इसलिए बैक बटन दबाकर कोई समस्या नहीं है। – AP257

5

Django रूप आपके उपयोग के मामले में विशेष रूप से सहायक नहीं हैं। साथ ही, एक खोज पृष्ठ के लिए, जीईटी फॉर्म का उपयोग करना और यूआरएल में राज्य बनाए रखना बेहतर है। निम्नलिखित कोड बहुत, छोटे आसान है और HTTP मानकों के अनुरूप है कहीं बेहतर:

def search(request): 
    q = request.GET.get('q','').strip() 
    results = get_some_results(q) 
    render_to_response("things/search.html", {'q': q, 'results': results}) 

टेम्पलेट:

<form method="GET" action="."> 
<p><input type="text" value="{{ q }}" /> <input type="submit" value="Search" /></p> 
{% if q %} 
    {% if results %} 
     Your results... 
    {% else %} 
     No results 
    {% endif %} 
{% endif %} 
</form> 
+0

+1, वास्तव में अपने इरादों को बेहतर ढंग से पूरा करने लगता है। – cethegeek

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