私は物事を複雑にしすぎたかもしれません。
私には 2 つの見方があります。最初のビューは、フォームからのユーザーの入力に基づいて一連の一時データを生成します。生成された各データには、名前とその他のデータが含まれています。名前のみをテンプレートに渡して、ハイパーリンクのリストとしてレンダリングしたいと考えています。ユーザーがそれらのいずれかをクリックした場合、ビューがそれを操作できるように、ユーザーがクリックした特定の名前を 2 番目のビューに付ける必要があります。唯一の問題は、名前に関連付けられたその他のデータを取得する方法がわからないことです。
生成されたその他のデータには、URL の標準文字ではないランダムな文字が含まれている可能性があるため、名前だけの場合のようにその他をハイパーリンクに変換することはできません。
私はこのようなものを持っています:
ビュー:
# 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 %}
1 つの解決策は、一連のセッション変数を作成することです。
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) を拡張すると、その他のデータに '&' と '=' が含まれている場合はどうなりますか? 2番目のビューによるキーと値である解析が台無しになります。また、その他のデータには通常とは異なる文字が含まれている可能性があるため、表示される URL の一部としてそれを許可するのは不適切な場合があります。
3) Django は、最初のビューから生成されたその他のデータが 2 番目のビューに渡されたものと異なる可能性があるように、ユーザーがセッションのその他のデータを悪意を持って変更することを許可していませんか? それは問題でしょう!