1

我可能把事情复杂化了。

我有两种看法。第一个视图根据用户在表单中的输入生成一堆临时数据。每个生成的数据都包含一个名称和其他数据。我只想将名称传递给要呈现为超链接列表的模板。如果用户单击其中一个,则应为第二个视图指定用户单击的特定名称,以便视图可以对其进行操作。唯一的问题是,我不知道如何获取与名称相关的杂项数据。

生成的 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 是否可以防止用户恶意修改会话杂项数据,以便从第一个视图生成的杂项数据可能与传递给第二个视图的数据不同?那将是一个问题!

4

1 回答 1

0

您可能希望将字典作为会话变量、设置 cookie 或通过数据链接作为 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>
于 2012-04-23T05:53:24.857 回答