2011-01-11 9 views
2

私は、検索基準を受け入れてレポートを表示するWebアプリケーションを作成しています(ユーザーが結果に満足したら、基準と参照の両方を保存します)。これらのオブジェクトはデータベースに戻されます。1つのページに複数のフォーム用のエレガントなソリューション

私は2つの形態を持つためにエレガントな解決策を見つけることです抱えている問題:

  1. ディスプレイ(GET)その基準の結果。
  2. いくつかの説明を入力し、すべてをデータベースに保存(POST)します。

私はGETのためのAJAXと保存のためのPOSTに傾いていますが、より洗練されたソリューションが最初にないことを確認したいと思いました。

答えて

6

ajaxを実装する前に、javascriptを無効にしてフォームを動作させようとします。 2つのフォームは同じビューを指すことができます。 アクションをルーティングする場合は、<input type="submit">の代わりに、namevalueという属性を持つ<button 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 %} 

そう醜いない1つのフォームテンプレート

<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 ... 

次にいくつかのアヤックスがあります

0

保存するリストは、formset_factory(http://docs.djangoproject.com/ja/dev/topics/forms/modelforms/#model-formsets)で作成する必要があります。とにかく、モデルを保存しようとしているときに、request.POST ['list']。getitems()をループする理由はありません。

Xavierのビュー/コントローラの設定は、検索またはフォームの送信のいずれかを検出するのに正しいです。

関連する問題