单页上多种表单的优雅解决方案

时间:2011-01-11 01:44:24

标签: ajax django django-forms get postback

我正在构建一个Web应用程序(在Django中),它将接受搜索条件并显示报告 - 一旦用户对结果感到满意,将条件和对这些对象的引用保存回数据库。 / p>

我遇到的问题是找到一个优雅的解决方案,有两种形式:

  1. 显示(GET)其标准的结果。
  2. 输入一些说明,然后将所有内容保存(POST)回数据库。
  3. 我倾向于使用AJAX获取GET内容和POST保存,但我想确保首先没有更优雅的解决方案。

2 个答案:

答案 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的视图/控制器设置正确,可以检测搜索或表单提交。