在我的Django应用程序中,向用户呈现一个简单的表单,在验证时,视图搜索数据(一些Web抓取)并返回一个模板,在我们添加结果列表的上下文中,我们将它们呈现给用户和他/她选择一个(这是我的问题)我希望将该选择返回到另一个视图(现在我们要将所选对象添加到数据库中)。
我确定了我的问题,但我真的认为我错过了一些东西而没有正确使用Django。现在这就是我如何显示数据并将其放回形式:(玉模板。当然我用更多的属性做这个,所以模板很大,我必须为我想要的每个值添加一个隐藏的输入)
for b in result_list
h4
for aut in b.authors
div {{ aut }}
form(action='/add/', method='post') {% csrf_token %}
{% csrf_token %}
input(type='hidden', value="{{ b.authors }}", name='authors')
edit2 :每本书只有一个按钮。我只想回一本书。
当作者有一个单独的元素时,它可以正常工作,但有多次模板不会返回有效的json 。我可以给你结构,但我倾向于认为这不是重点。
我错过了什么?如何显示搜索结果并将选定的视频转换到另一个视图?
我是否会错过表格?我应该使用会话变量,带有中间件的上下文处理器吗?我猜隐藏的输入是错误的:我怎么能做不同的事?
非常感谢编辑 下面我展示了我的问题所在。但是,也许我不应该解决这个问题,而是以正确的方式使用Django。
1-我的第一个视图呈现模板并将其与搜索结果一起提供:
return render(request, "search/search_result.jade", {
"return_list": book_list,
})
book_list
是一个dicts列表,其中authors
是unicode str的列表:
retlist[0]["authors"]
>>> [u'Ayroles, Alain']
2-我的模板在上面。它显示一个表单和一个隐藏的输入。我们的目标是寄回一本书:一本带有标题的词典,编辑......以及一份作者名单。
3-现在用户点击“添加此书”,我们处于“添加”视图中。让我们来看看作者:
req = request.POST.copy()
authors = req["authors"]
>>> u"[u'Ayroles']" # note the u after the [
# this is not a valid json, I can't get a list out of it
import json
json.loads(req["authors"])
>>> *** ValueError: No JSON object could be decoded
所以我从第一个视图传递到模板的列表,我解析并显示它,但模板没有返回有效的列表/ json到POST参数中的第二个视图,我无法提取我的作者。我不知道该怎么想:
答案 0 :(得分:1)
这就是我的看法。这不是一个真正的答案,但已经有太多的代码可以用于评论
模板:
for b in result_list
h4
for aut in b.authors
div {{ aut }}
form(action='/add/', method='post')
{% csrf_token %}
input(type='hidden', value="{{ b.authors }}", name='authors')
input(type='submit', value="Add book")
查看:
if request.method == 'POST':
authors = request.POST.get['authors']
#do something with authors, e.g. create a JSON string:
authors_JSON = json.dumps(authors)
使用Django表单的逻辑相同:
查看:
if request.method == 'POST':
book = BookForm(request.POST)
#do something with authors, e.g. create a JSON string:
authors_JSON = json.dumps(book.authors)
Forms.py:
class ContactForm(forms.Form):
authors = forms.CharField(max_length=100)
#etc, possibly including custom __init__ logic
那个'你'的事情,它的发生是因为你在一个对象上做了json.loads()。如果你想序列化,它应该是json.dumps(),否则数组转换为字符串然后被视为JSON,这就是Python unicode标记到达那里的原因(即不是模板错误)
答案 1 :(得分:1)
我终于明白了:我们可以使用session
轻松地在视图之间共享数据。
会话在默认的Django安装中激活。我们只需选择会话引擎:在临时文件中,在内存中......
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
现在在我的search/
网址中,我可以在request.session
中添加一个变量,这是一个类似于字典的对象:
search_results = compute_and_get_data()
request = search_results()
我使用search_results
列表提供模板。在我的模板中,我迭代它并使用单个隐藏输入字段来返回for循环的计数器。
for b in search_results
table
tr
td
h4 {{b.authors}}
form(action='/add/', method='post') {% csrf_token %}
{% csrf_token %}
input(type='hidden', value="{{ forloop.counter0 }}", name='forloop_counter0')
input.btn.btn-primary(type='submit', value='add book', title="add that book to my collection")
在提交时,我们输入add/
视图。在这里,我可以获得用户选择的书:
forloop_counter0 = int(request.POST["forloop_counter0"])
book = request.session["search_result"][forloop_counter0]
现在我的book
是一个包含大量信息的词典。我没有必要处理json格式等。
这个问题帮助了我: