ajax - 当浏览器中的值发生变化时,如何刷新 django 管理表单?

标签 ajax django python-3.x django-admin

我有一个选择字段,当更改为另一个值时,它必须更改表单中的其他字段。

所以我需要刷新表单,或使用 ajax 调用就地更新字段。管理表单可以做到这一点吗?

最佳答案

不久前遇到了这个问题。这是我最终解决它的方法,例如过滤 Buildings下至 Floors下至 Rooms (Django 2.0.3):

#admin.py
class BuildingAdmin(admin.ModelAdmin):
  class Media:
    js = ("jquery-3.3.1.min.js","buildingfilter.js")
# Your other admin options for fields, filters, etc.
# The script will use the id's of the fields you included
# If the filters you want aren't actually FK's in the model,
#  just use a ModelForm to add extra fields and use those
#  element id's in the script.

#views.py
def building(request):
  if request.method == 'GET' and request.is_ajax():
    building_id = request.GET.get('id')
    json_floor = serializers.serialize("json", Floor.objects.filter(fkbuilding_id=building_id))
    return HttpResponse(json_floor, content_type='application/json')
  else:
    return HttpResponse("no-go")

def floor(request):
  if request.method == 'GET' and request.is_ajax():
    floor_id = request.GET.get('id')
    json_room = serializers.serialize("json", Room.objects.filter(fkfloor_id=floor_id))
    return HttpResponse(json_room, content_type='application/json')
  else:
    return HttpResponse("no-go")

#urls.py
urlpatterns = [
  ...
  path('building/', views.building),
  path('floor/', views.floor),
]

#buildingfilter.js
$(function(){
    //Boilerplate AJAX loading if using cookies
    function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
    console.log("Cookies loaded");
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    console.log("CRSF Safe");
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});
//Code that does the filtering
$("#id_building").on('change', function(e) {
    e.preventDefault();
    console.log($(this).val());
    $.getJSON("http://127.0.0.1:8000/building/",{id: $(this).val()}, function(j) {
        var options = '<option value="">---??---</option>';
        for (var i = 0; i < j.length; i++) {
            options += '<option value="' + parseInt(j[i].pk) + '">' + j[i].fields['name'] + '</option>';
        }
        console.log(options);
        $("#id_floor").html(options);
        $("#id_floor option:first").attr('selected', 'selected');
    });
    $("#id_building").attr('selected', 'selected');
});
$("#id_floor").on('change', function(e) {
    e.preventDefault();
    console.log($(this).val());
    $.getJSON("http://127.0.0.1:8000/floor/",{id: $(this).val()}, function(j) {
        var options = '<option value="">---??---</option>';
        for (var i = 0; i < j.length; i++) {
            options += '<option value="' + parseInt(j[i].pk) + '">' + j[i].fields['name'] + '</option>';
        }
        console.log(options);
        $("#id_room").html(options);
        $("#id_room option:first").attr('selected', 'selected');
    });
    $("#id_floor").attr('selected', 'selected');
  });
});

关于ajax - 当浏览器中的值发生变化时,如何刷新 django 管理表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28929976/

相关文章:

php - ajax-PHP-MySQL 是聊天室应用程序的良好组合吗?

django - 'RelatedManager' 对象不是可迭代的 Django

Django设计问题: extending User to make users that can't log in

python-3.x - 如何使用 `re.findall`从字符串中提取数据

php - JavaScript 不会显示/隐藏 div - 使用 PHP/MySQL

javascript - Ajax 调用以获取从 HTML 选择选项中选择的值

php - ajax:responsetext 在本地返回我的整个 php 代码

python - 如何在 Django 中使用注释进行分组?

python - 用重复行替换原始行,然后删除重复行

python - 删除另一个数组中的元素