2012-04-23 63 views
1

我可能有過於複雜的事情。在Django中通過模板在兩個視圖之間共享數據?

我有兩個意見。第一個視圖根據用戶的表單輸入生成一堆臨時數據。每個生成的數據都包含一個名稱和misc數據。我只想將名稱傳遞給要作爲超鏈接列表呈現的模板。如果用戶點擊其中的一個,則應該爲第二個視圖指定用戶點擊的特定名稱,以便視圖可以操作它。唯一的問題是,我不知道如何獲得與名稱相關的misc數據。

生成的misc數據可能包含隨機字符,這些字符不是URL中的標準字符,所以我不能將misc變成超鏈接,就像我只能使用名稱一樣。

我有這樣的事情:
觀點:

# Displays the temp data names 
def display(request): 
    return render_to_response('display.html',{},context_instance=RequestContext(request)) 

# User provides input, generate temp data to be displayed as hyperlinks 
def search(request): 
    form = SearchForm(request.POST) 
    if form.is_valid(): 
     usr_input = form.cleaned_data['input'] 
     data = generate_data(usr_input) # generates a list of (name, misc) data. 
     request.session['hyperlinks'] = get_list_names(data) # returns only names in data 
     return HttpResponseRedirect('views.display') 

    else: 
     .... 

# User has clicked on a hyperlink, we must process specific data given its name. 
def process_data(request, name): 
    # How to get associated misc data created from search()? 

我沒有寫模板還沒有,但這個想法是:
模板:

{% for name_link in request.session.hyperlinks %} 
    <a href={% url process name_link %}> 
{% endfor %} 

一種解決方案可能會創建一堆會話變量:

for name in get_list_names(data): 
    request.session[name] = // associated misc data 

但這看起來很浪費。另外,我必須稍後再管理刪除會話變量,因爲這只是基於用戶輸入生成的臨時數據。來自用戶的新輸入將創建另一個巨大的會話變量!

另一種解決方案可能是將其臨時存儲在數據庫中,但這似乎也不是一個好主意。



編輯 - 通過christophe31試行建議: 我不是很確定如果我理解你的建議,但像這樣的東西嗎?

data_dict = {name1:misc1, name2:misc2, etc...} 
encoded = urllib.urlencode(data_dict) # encoded = 'name1=misc1&name2:misc2...etc' 
request.session['hyperlinks'] = encoded 

上這雖然有幾個問題:
1)會不會使用的urllib擊敗有字典的目的編碼呢?它返回一個字符串而不是字典

2)要展開(1),如果misc數據中有'&'和'=',那該怎麼辦?它會搞砸解析,這是第二個視圖的關鍵和價值。另外,misc數據可能有不尋常的字符,因此允許它成爲要顯示的URL的一部分可能是不好的。

3)Django是否允許用戶惡意修改會話misc數據,以便從第一個視圖生成的misc數據可能與傳遞給第二個視圖的misc數據不同?這將是一個問題!

回答

0

您可能希望將字典作爲會話變量,設置cookie或通過鏈接數據的get參數傳遞。

對於我來說,你必須將所有這些數據放在字典中,然後將其作爲get參數(使用urllib2)導出或存儲在用戶的會話中。

問我是否需要建議的更多信息。

編輯

他們是2種方式我看到的,通過會話:

data_dict = {name1:misc1, name2:misc2, etc...} 
request.session['hyperlinks'] = data_dict 

或者傳遞到模板中的數據,如果沒有會話後端:

data_dict = {name1:misc1, name2:misc2, etc...} 
encoded = urllib.urlencode(data_dict) 
return render(request, "my_template.html", {"url_params":encoded,} 

<a href="{% url my_view %}?{{ url_params }}">Go to results</a> 
+0

嗨,我根據你的建議編輯了我的帖子。你能澄清一點嗎?謝謝! – sharkfin 2012-04-23 14:29:25

+0

對不起,我的意思是他們不止一種方式,讓我解釋一下 – christophe31 2012-04-24 09:14:30

+0

謝謝,我也看了reverse()。我認爲這可能是一個更好的方式去處理我的具體情況。 – sharkfin 2012-04-25 22:07:47

相關問題