我可能有过于复杂的事情。
我有两个观点。第一个视图根据用户从表单输入生成一堆临时数据。每个生成的数据都包含名称和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数据有'&amp;'怎么办?和'='在里面?它会搞砸解析第二个视图的关键和值。此外,misc数据可能有不寻常的字符,因此允许它成为要显示的网址的一部分可能是坏的。
3)Django是否允许用户恶意修改会话misc数据,以便从第一个视图生成的misc数据可能与传递给第二个视图的misc数据不同?那将是一个问题!
答案 0 :(得分:0)
您可能希望将字典作为会话变量,设置cookie或通过链接传递为get参数。
对我来说,你必须先将所有这些数据放入字典中,然后再将其作为get参数导出(使用urllib2)或将其存储在用户的会话中。
询问我是否需要有关建议方式的更多信息。
修改强>:
我通过会话看到了两种方式:
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>