【问题标题】:Sharing data between two views through template in Django?通过Django中的模板在两个视图之间共享数据?
【发布时间】:2012-04-23 05:38:14
【问题描述】:

我的事情可能过于复杂。

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

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

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    您可能希望将字典作为会话变量、设置 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>
    

    【讨论】:

    • 您好,我根据您的建议编辑了我的帖子。你能澄清一下吗?谢谢!
    • 对不起,我的意思是他们不止一种方式,让我解释一下
    • 谢谢,我还查看了 reverse()。我认为这对于我的特殊情况可能是更好的方法。
    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多