在Django中通过模板在两个视图之间共享数据?

时间:2012-04-23 05:38:14

标签: django django-templates django-views

我可能有过于复杂的事情。

我有两个观点。第一个视图根据用户从表单输入生成一堆临时数据。每个生成的数据都包含名称和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数据不同?那将是一个问题!

1 个答案:

答案 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>