Django - 从模板表单返回一个对象(从搜索结果中)

时间:2014-03-25 11:56:48

标签: django django-forms django-templates

在我的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参数中的第二个视图,我无法提取我的作者。我不知道该怎么想:

  • 其他我想做的事情很好,我只需要更好地处理我的数据结构
  • 否则我不应该这样做并使用更多Django:使用更多表单?会议?

2 个答案:

答案 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格式等。

这个问题帮助了我: