2014-03-25 44 views
0

在我的Django應用程序中,用戶呈現一個簡單的表單,在驗證視圖搜索數據(一些網頁抓取)並返回一個模板其中我們添加了結果列表的上下文,我們將它們呈現給用戶,並且他/她選擇一個(這是我的問題)我想讓該選項回到另一個視圖(現在我們要添加選中對象到數據庫)。Django - 從模板表單返回對象(從搜索結果)

我發現我的問題,但我真的認爲我錯過了一些東西,並沒有正確使用Django。現在這就是我如何顯示數據並將其放回一個表單中:(當然,我使用更多的屬性來完成此操作,所以模板非常大,我必須爲每個要返回的值添加一個隱藏的輸入)

for b in result_list 
     h4 
     for aut in b.authors 
      div {{ aut }} 

     form(action='/add/', method='post') {% csrf_token %} 
     {% csrf_token %} 
     input(type='hidden', value="{{ b.authors }}", name='authors') 

EDIT2:有每本書一個按鈕。我只是想返回一本書。

當作者有一個單一元素時它可以正常工作,但不止一次模板不返回有效的json。我可以給你的結構,但我傾向於認爲這不是重點。

我缺少什麼?如何顯示搜索結果並將選定的一個顯示到另一個視圖?

我錯過了關於表單的東西嗎?我應該使用一個會話變量,一個帶中間件的上下文處理器嗎?我想隱藏的輸入是錯誤的:我怎麼能做不同?

千恩萬謝


編輯:下面我展示在我的問題。但是,也許我不應該解決這個問題,而是用正確的方式使用Django。

1 - 我的第一視圖呈現模板,並與搜索結果餵它:

return render(request, "search/search_result.jade", { 
     "return_list": book_list, 
     }) 

book_list是類型的字典列表,其中authors是unicode海峽的列表:

retlist[0]["authors"] 
>>> [u'Ayroles, Alain'] 

2 - 我的模板在上面。它顯示一個表單和一個隱藏的輸入。我們的目標是發回一本書:一本書名爲詞典,編輯......以及一份作者名單。

3-現在用戶點擊「添加此書」,我們處於「添加」視圖。讓我們來考察作者:

req = request.POST.copy() 
authors = req["authors"] 
>>> u"[u'Ayroles']" # note the u after the [ 
# this is not a valid json, I can't get a list out of it 
import json 
json.loads(req["authors"]) 
>>> *** ValueError: No JSON object could be decoded 

所以我從第一個視圖模板通過的名單,我分析它,並顯示它,但模板沒有一個有效的列表/ JSON返回的第二視圖POST參數和我無法提取我的作者。我不知道在想什麼:

  • 還有什麼我想要做的是不錯,我只是要更好地處理我的數據結構
  • 否則我就不會做這樣的,使用更多的Django的:使用更多的表單?會議?
+0

可以提供更多的細節?我仍然無法解決問題。例如。 - 我有網頁,有多個選擇,形式包含在-format- IDS,我想選擇的對象ID傳遞到表單處理程序,它應該做的-blablablah-,這是行不通的,而不是權利, - 我期望得到什麼 - 錯誤結果 - 。 (?)而且,模板(?僞)代碼看起來怪怪 – Marat

+0

嗨,也許這是什麼使得它更加困難:沒有對象ID,因爲我沒有從數據庫中獲取我的搜索結果。 (該模板是一個可以編譯爲html的jade模板:http://jade-lang.com/reference/縮進非常重要,就像在Python中一樣)。一個推導出的問題:您認爲在模板中編寫±10個隱藏輸入以獲取值是一種很好的做法嗎? – Ehvince

+0

好吧,無論如何,你必須以某種方式識別這些實體(也許是URL)。是的,有多個隱藏輸入是完全可以的。用戶應該能夠選擇多個項目?您希望用戶如何選擇作者(例如,通過勾選框,下拉列表,單擊特定的作者)? – Marat

回答

1

我終於明白了:我們可以使用session輕鬆共享視圖之間的數據。

會話在默認的Django安裝中激活。我們只需要選擇一個會話引擎:在一個臨時文件,在內存中,...

SESSION_ENGINE = 'django.contrib.sessions.backends.file' 

現在在我的search/網址我可以在request.session添加變量,一個dictionnary類對象:

search_results = compute_and_get_data() 
request = search_results() 

我使用search_results列表提供我的模板。在我的模板中,我迭代了它,並使用一個隱藏的輸入字段返回for循環的計數器。我們進入add/視圖。在這裏,我能得到這本書選擇的用戶:

forloop_counter0 = int(request.POST["forloop_counter0"]) 
book = request.session["search_result"][forloop_counter0] 

現在我book是一個有很多的信息dictionnary。我不必處理json格式等。

這個問題讓我:

1

這就是我所看到的。這是不是一個真正的答案,但它已經太多的代碼投入評論

模板:

for b in result_list 
    h4 
    for aut in b.authors 
     div {{ aut }} 
     form(action='/add/', method='post') 
      {% csrf_token %} 
      input(type='hidden', value="{{ b.authors }}", name='authors') 
      input(type='submit', value="Add book") 

查看:

if request.method == 'POST': 
    authors = request.POST.get['authors'] 
    #do something with authors, e.g. create a JSON string: 
    authors_JSON = json.dumps(authors) 

同樣的邏輯,使用Django形式:

查看:

if request.method == 'POST': 
    book = BookForm(request.POST) 
    #do something with authors, e.g. create a JSON string: 
    authors_JSON = json.dumps(book.authors) 

Forms.py:

class ContactForm(forms.Form): 
    authors = forms.CharField(max_length=100) 
    #etc, possibly including custom __init__ logic 

這 'U' 的東西,這是因爲你做json.loads()的對象上。如果你想序列化,它應該是json.dumps(),否則數組轉換爲字符串,然後視爲JSON,這就是爲什麼Python unicode標記到達那裏(即不是模板bug)

+0

謝謝。在我的腦海裏,如何管理一個作者列表並不是很清楚,但我會看到它如何與表格結合(將在幾天內被接受)。然而,我沒有'加載'對象,而是一個字符串(這是對象的表示)。你說我應該在將作者列表放入表單並將其提供給模板之前序列化作者列表?那好吧,這是有道理的。 – Ehvince

+0

萬一你有多個輸入與name = authors,response.POST ['authors']是一個列表,否則它是一個字符串。無論如何,我不明白爲什麼你需要在傳遞給模板之前序列化它,我認爲它是你的應用程序邏輯的一部分 – Marat

+0

mmmh我目前正在閱讀關於基於類的視圖,這可能是要走的路。我會將搜索結果聲明爲一個類屬性,以便它們在我的2個視圖(類的方法)中可見。因此,在我的模板中,我不必返回本書的每一個領域,而只是一個唯一的ID。我不會再打擾作者列表返回的格式。希望這是它的工作原理。你對此有何看法?再次感謝:) – Ehvince

相關問題