我可能有過於複雜的事情。在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數據不同?這將是一個問題!
嗨,我根據你的建議編輯了我的帖子。你能澄清一點嗎?謝謝! – sharkfin 2012-04-23 14:29:25
對不起,我的意思是他們不止一種方式,讓我解釋一下 – christophe31 2012-04-24 09:14:30
謝謝,我也看了reverse()。我認爲這可能是一個更好的方式去處理我的具體情況。 – sharkfin 2012-04-25 22:07:47