0

我正在尝试将 Django 生成的表单与 AJAX 调用一起用于数据填充。我只有一个普通的 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、隐藏字段等,因为 formset 已经处理了所有这些。

当您发布表单集时,您已经有了代码

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)中?使用编辑学校的链接,您将拥有一个表单集所在位置的元素。(大概你已经将学校对象传递给模板,并且有一个提交按钮等)

学校.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 作为锚标记属性将验证为适当的属性,但我理解,“它有效”。我通常将类似 schoolid 的东西存储在隐藏的输入中以在 js 中访问它,尽管可能有更优雅的方式

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