我正在构建一个Web应用程序(在Django中),它将接受搜索条件并显示报告 - 一旦用户对结果感到满意,将条件和对这些对象的引用保存回数据库。 / p>
我遇到的问题是找到一个优雅的解决方案,有两种形式:
我倾向于使用AJAX获取GET内容和POST保存,但我想确保首先没有更优雅的解决方案。
答案 0 :(得分:6)
在实现ajax之前,我会尝试让表单在禁用javascript的情况下运行。 2个表单可以指向相同的视图。
对于路由操作,您可以使用填充了<button type="submit">
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
答案 1 :(得分:0)
在我看来,您的保存列表应该使用formset_factory(http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets)创建。当你打算保存模型时,没有理由循环遍及request.POST ['list']。getitems()。
Xavier的视图/控制器设置正确,可以检测搜索或表单提交。