【问题标题】:Elegant solution for multiple forms on single page单页上多个表单的优雅解决方案
【发布时间】:2011-06-06 21:47:04
【问题描述】:

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

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

  1. 显示 (GET) 其标准的结果。
  2. 输入一些描述,然后将所有内容保存 (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 的视图/控制器设置对于检测搜索或表单提交都是正确的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        相关资源
        最近更新 更多