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

Posted

技术标签:

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

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

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

    显示 (GET) 其标准的结果。 输入一些描述,然后将所有内容保存 (POST) 回数据库。

我倾向于使用 AJAX 来获取 GET 内容,并使用 POST 来保存,但我想首先确保没有更优雅的解决方案。

【问题讨论】:

【参考方案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 的视图/控制器设置对于检测搜索或表单提交都是正确的。

【讨论】:

以上是关于单页上多个表单的优雅解决方案的主要内容,如果未能解决你的问题,请参考以下文章

text 单页上的作者生物和图像

在单页上应用触摸滑动,用于动态加载数据的页面?

php 根据单页上的帖子类型列出帖子类型

rails turbolinks 在单页上加载 javascript

php 显示相同分类中的相关自定义帖子 - 仅在单页上显示

如何在 Laravel 的一页上拥有多个 Yajra 数据表?