【问题标题】:Elegant solution for multiple forms on single page单页上多个表单的优雅解决方案
【发布时间】:2011-06-06 21:47:04
【问题描述】:
我正在构建一个 Web 应用程序(在 Django 中),它将接受搜索条件并显示报告 - 一旦用户对结果感到满意,将条件和对这些对象的引用保存回数据库。
我遇到的问题是找到一个优雅的解决方案来拥有 2 种形式:
- 显示 (GET) 其标准的结果。
- 输入一些描述,然后将所有内容保存 (POST) 回数据库。
我倾向于使用 AJAX 来获取 GET 内容,并使用 POST 来保存,但我想首先确保没有更优雅的解决方案。
【问题讨论】:
标签:
ajax
django
django-forms
get
postback
【解决方案1】:
在实现 ajax 之前,我会尝试让表单在禁用 javascript 的情况下工作。这两种形式可以指向同一个视图。
对于路由操作,您可以使用 <button type="submit">tags 填充 name value 属性,而不是 <input type="submit">。
2 个表单模板
<form action="{% url your-url %}" method="get">
<input type="text" name="q" value="{{ q }}">
<button type="submit" name="action" value="search">Search</button>
</form>
{% if entries %}
...
<form action="{% url your-url %}" method="post">
<input type="hidden" name="q" value="{{ q }}">
<button type="submit" name="action" value="save">Save entries</button>
</form>
{% endif %}
不那么难看的表单模板
<form action="{% url your-url %}" method="post">
<input type="text" name="q" value="{{ q }}">
<button type="submit" name="action" value="search">Search</button>
{% if entries %}
...
<button type="submit" name="action" value="save">Save entries</button>
{% endif %}
</form>
然后,将“动作”捕捉到您的视图中,就像这段代码(未测试)
def your_view(request, *args, **kwargs):
action = request.REQUEST.get('action', None)
if request.method == 'POST' and action == 'save':
# do the save stuff
elif action == 'search':
# no need to check if it's a GET
if request.REQUEST.get('q', None):
# do the display stuff
else:
# q required, maybe push a warning message here
else:
# default stuff
return # the response ...
然后你可以做一些ajax
【解决方案2】:
在我看来,您要保存的列表应该使用 formset_factory (http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets) 创建。当你要保存模型时,真的没有理由循环 request.POST['list'].getitems() 。
Xavier 的视图/控制器设置对于检测搜索或表单提交都是正确的。