2011-01-11 121 views
2

我正在构建一个Web应用程序(在Django中),它将接受搜索条件并显示报告 - 一旦用户对结果满意,将条件和参考这些对象返回到数据库。单一页面上多种形式的优雅解决方案

我有是找到一个很好的解决方案对于具有2种形式所述的问题:

  1. 显示(GET)的他们的标准的结果。
  2. 输入一些描述,并将所有内容保存(POST)回数据库。

我倾向于AJAX的GET东西和POST保存,但我想确保没有更优雅的解决方案。

回答

6

在实现ajax之前,我会尝试使JavaScript禁用的表单工作。这两种形式可以指向相同的观点。 对于路由操作,您可以使用<button type="submit">标记,其中namevalue属性已填充,而不是<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

0

在我看来,保存的列表应该使用formset_factory(http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets)创建。当你打算保存模型时,真的没有理由循环request.POST ['list'] .getitems()。

Xavier的视图/控制器设置是正确的,以检测搜索或表单提交。

相关问题