2009-12-10 6 views
8

장고 초보자 질문에 대한 초기 값을 전달합니다.는 .... 장고 양식 필드

여기 내 양식이다 :

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) POST 후 권장되는 것은 리디렉션하는 것입니다 ... 여기 좋지 않다. 이렇게하면 뒤로 버튼을 사용할 때 양식을 다시 제출한다는 악명 높은 팝업이 표시되지 않습니다.

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 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, 
    }) 

주의 사항 :

말했다 모든

, 난 당신이 뭔가를하려는 생각합니다.

희망이 있습니다.

+2

오류 인해 딕셔너리 대신 유니 코드 객체를 전달하는 것입니다. (dict는 'get()'을 정의하지만 string/unicode는 그렇지 않습니다). – spookylukey

+0

아, 훌륭한 지적. 나는 오류를 보았지만 연결을 만들지 않았다! – cethegeek

+0

자세한 설명과 솔루션에 감사드립니다. 결과 URL을/search/query처럼 보이기를 원했기 때문에 이런 식으로 구현했습니다. (문제가 있음을 알고 있지만 잘 수정할 수도 있습니다.) POST가 끝나면 리디렉션되므로 뒤로 버튼을 눌러도 아무런 문제가 없습니다. – AP257

5

장고 (Django) 양식은 사용 사례에 특히 도움이되지 않습니다. 또한 검색 페이지의 경우 GET 양식을 사용하고 URL에 상태를 유지하는 것이 훨씬 좋습니다. 다음 코드는 훨씬 짧은 간단하고 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