2009-12-10 20 views
8

Django yeni soru için bir başlangıç ​​değeri geçirin..... Django form alanına

İşte benim biçimi şöyledir:

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

Ve burada görüşlerim kod:

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

Ama bu bana hata veriyor: Ben başlangıç ​​değeri geçebilir nasıl

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

? Denedim çeşitli şeyler request.POST parametresi ile müdahale görünüyor.

cevap

9

birkaç şey

1) POST sonra önerilen şey yönlendirmek için ... burada iyi değildir. Bu, arka butonu kullanırken formu yeniden gönderdiğinizi söyleyen rezil pop-up'ları önler.

2) Sadece if request.POST, if request.method == 'POST' demenize gerek yoktur. Bu kodunuzun okunmasını kolaylaştırır. daha basit ve çok daha karmaşık görüşler var olamayacağını söylemek değildir

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) görünümü genellikle şöyle görünür. Fakat bu bir görüşün özüdür: eğer talep post prosesi ise form ve yönlendirme ise; talep formu oluşturuyorsa.

Neden bir "Unicode" hatası aldığınızı bilmiyorum. Sadece sizin modellerinizden birinin sizin sağladığınız ile ilgili olduğunu düşünebilirim. Spookylukey'den bahsedildiği gibi hata, kendi yorumundadır, büyük olasılıkla ilk parametre için bir dict yerine bir dize göndermeniz neden olur.

Gerçekten de django belgelerini particular the tutorial. numaralı telefondan tavsiye ederim, ancak çok güzel olan Django Book. başlangıç ​​parametresi formun alan değerleri dict olduğunu

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

Uyarı:

söyledi tamamı

, ben gibi bir şey istediğini düşünüyorum.

Bu yardımcı olur umarım.

+2

hata nedeniyle dict yerine unicode nesne geçirerek etmektir. (dict 'get()' öğesini tanımlar, ancak string/unicode içermez). – spookylukey

+0

Ah, mükemmel nokta. Hatayı gördüm ama bağlantıyı yapmadım! – cethegeek

+0

Detaylı yorumlar ve çözüm için teşekkürler. Bu şekilde uygulardım çünkü sonuç URL'lerinin/search/query gibi görünmesini istedim (bununla ilgili problemler olduğunu biliyorum ve iyi bir şekilde revize edebilirim). POST'tan sonra yönlendirme yapıyorum, bu yüzden Geri düğmesine basmakla ilgili bir sorun yok. – AP257

5

Django formları, kullanım durumunuz için özellikle yararlı değildir. Ayrıca, bir arama sayfası için, bir GET formu kullanmak ve URL'de durumu korumak daha iyidir. Aşağıdaki kod çok daha kısa basittir ve HTTP standartlarına çok daha iyi uygundur:

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

şablonu:

<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, aslında niyetlerini daha iyi yerine getiriyor gibi görünüyor. – cethegeek

İlgili konular