2016-05-18 7 views
3

私が達成しようとしていることは難しくありませんが、私はそれをどうやって行うのかわかりません!Django - フォームに新しいオブジェクトを作成し、選択ボックスを更新して保存します。

私が必要とするのは、Django Adminにある機能です。新しいオブジェクトを作成しているときに、外部キーを持っていれば新しいデータを追加してポップアップを開き、保存してから選択ボックスは自動的に更新されます。私が持っているもの

はこのフォームである:

enter image description here

私はいくつかのJavascriptでそれを行うのは簡単だろうけど、私のポイントは、Djangoはいくつかのルールを持っている、そして限り私が知っている、I既に作成されたフォームに新しいデータを追加することはできません。それ以外の場合、Djangoはこのフォームを検証しません。どうすればこれを達成できますか?

PS: "Local"は、新しいデータを追加する選択ボックスです。ユーザーは、このページで別のページに行く代わりに、新しいローカルを作成することができます。ありがとう:)

+0

http://stackoverflow.com/questions/7782479/django-reverse-engineering-the-admin-sites-add-foreign-key-buttonこちらをご覧ください。 –

答えて

0

あなたの新しいコンボボックスのキーがデータベースに正しいキーを持っている限り、javascriptを使用して値を更新することは何も問題ありません。

最後のエントリを保存した後にこの関数を呼び出します。

function refreshLocal(){ 
    $.get(window.location.href, '', function(html){ 
     // change the id to the local combox's id 
     var serverLocalDropBox = $(html).find('#id_local'); 
     if (serverLocalDropBox.length){ 
      $('#id_local').replaceWith(serverLocalDropBox); 
     } 
    }) 
} 

あなたはjavascriptのソリューションを使用したくない場合は、あなたがあるとしてフラグがちょうどフォームを検証し、返さないことを見れば、あなたはリフレッシュフラグで、サーバー側でフォームを投稿することができます。外部キーに新しいエントリがあるので、クエリーセットを自動的に更新して新しいエントリを追加します。

function serverRefreshLocal(){ 
     var $form = $('#your_form_id'); 
     $form.append('<input type="hidden" name="refresh" value="true" />'); 

     // you can use ajax submit and ajax refresh here if you don't want to leave the page 
     $form.submit(); 
    } 

//サーバーサイドここで

def your_form_post_view(request): 

    if request.POST.get('refresh', 'false') == 'true': 
     # initial is the trick to save user input 
     your_form = YourForm(initial=request.POST) 
     context = { 
      'form': your_form, 
     } 
     return render(request, 'your_template.html', context) 

    # your view code goes here 
1

あなたの質問:

私は右、すでに作成したフォームに新しいデータを追加することはできませんか?それ以外の場合、Djangoはこのフォームを検証しません。どうすればこれを達成できますか?その後

答え:

あなたが正しいと、Djangoは値が一致フォーム値のルールをチェックします。 しかし

あなたのメインフォームがGETとPOSTで2回呼び出されることを認識してください。両方のフォーム実行の間に、新しいフォームからデータベース値を変更します。すなわち、第2メインフォームの呼び出しでデータベースに追加値が利用可能であることを意味する:

field1 = forms.ModelChoiceField(queryset= ***1***) 
***1***

:第二の呼び出し新しい値にするfield1ですでに利用可能です。

次に、この件について心配する必要はありません。メインフォームのPOSTリクエストで新しい値がフォームに表示されます。

関連する問題