0

データ作成のための AJAX 呼び出しで Django 生成フォームを使用しようとしています。単純な ModelForm が機能しているだけですが、それに inlineformset を追加すると、いくつかの非表示の id フィールドにどの値を入力する必要があるか分からなくなります。すべての送信は新しいインスタンスを作成しています。住所のある学校の場合、保存ビューにこれがあります:

... get school logic here ...
if school_form.is_valid():
    school = school_form.save(commit=False)
    address_formset = AddressFormSet(request.POST, instance=school)
    if address_formset.is_valid():
        school_form.save()
        address_formset.save()
... redirection logic here ...

これは、フォームにデータを入力する JS です。#id_address_set-0-school#id_address_set-0-idは、2 つの Django 生成フィールドです。

$('a[name^="editSchool"]').click( function(e) {
  e.preventDefault();
  $.ajax({
    url: '/schooljson/' + this.getAttribute('schoolid') + '/'
  }).done( function(data) {
    $('#id_school_code').val(data.school_code);
    $('#id_full_name').val(data.school_name);
    $('#id_student_count').val(data.school_students);
    $('#id_school_pk').val(data.school_pk);
    $('#id_address_set-0-address_line_1').val(data.address_line_1);
    $('#id_address_set-0-address_city').val(data.address_city);
    $('#id_address_set-0-address_state').val(data.address_state);
    $('#id_address_set-0-address_zip').val(data.address_zip);
    $('#id_address_set-0-school').attr('value', data.school_pk);
    $('#id_address_set-0-id').attr('value', data.address_pk);
    $('#addSchoolModal').modal('show');
  });

私がそこに置くべきアイデアはありますか?

4

1 に答える 1

1

学校のインスタンスが既に利用可能な場合は、データをビューのフォームセットにバインドする方が簡単なようです。次のコードでは、id や隠しフィールドなどについて心配する必要はありません。これは、フォームセットですべてが処理されているためです。

フォームセットを POST すると、既にコードが含まれています

school = school_form.save(commit=False)
address_formset = AddressFormSet(request.POST, instance=school)

jsonデータを入力する代わりに、なぜそうしないのですか

views.py
def school_address(request, school_id):
    school = School.objects.get(pk=school_id)
    address_formset = AddressFormSet(instance=school)
    return render(request, "school/school_address.html",
                  {'address_formset': address_formset})

元のテンプレート (school.html) では? 学校を編集するためのリンクを使用すると、フォームセットの移動先の要素が得られます。(おそらく、すでに学校オブジェクトをテンプレートに渡し、送信ボタンなどを持っています。)

school.html

<form>
<a href="" id="edit_school" schoolid="{{ school.id }}">Edit</a>
{{ school_form }}
<div id="school_address"></div>
</form>

school_address.html は次のように単純にすることができます

{{ address_formset }}

現在、javascript では、success 関数が school_address.html を学校フォームのインラインにドロップし、必要なものがすべて入力されています。

$("#edit_school").click(function(e){
  e.preventDefault();
  $.ajax({
    url: '/school_address/' + this.getAttribute('schoolid') + '/'
    success: function(data){
      $("#school_address").html(data);
    }
  });
});

補足-アンカータグ属性としてのschoolidが適切な属性として検証されるとは思いませんが、「機能する」ことは理解しています。私は通常、js でアクセスするために schoolid のようなものを非表示の入力に保存しますが、もっとエレガントな方法があるかもしれません

<input type="hidden" id="schoolid" value="{{ school.id }} />
于 2012-04-25T11:17:28.950 に答える