我有一个Django模型,当列表可编辑中列出的字段触发了更改事件时,我正试图从Admin change_列表视图更新该模型.现在保存更新的唯一方法是单击"保存"按钮,然后重新加载页面.我根本不想重新加载页面.我只想让它异步更新模型.

例如,我有以下模型.

class Example(models.Model):
  name = models.CharField()
  hide = models.BooleanField(default=False)

在我的管理表格里

class ExampleAdmin(admin.ModelAdmin):
    list_display = [
        "name",
        "hide"
    ]

    list_editable = [
        "name",
        "hide"
    ]

现在查看示例的更改列表时,我将看到列出的值,其中包含一个可编辑的文本输入"名称"和一个"隐藏"复选框.

我想监听这些输入上的事件,当它们被触发时,发送一个异步请求来更新特定的模型.

UPDATE

这就是我现在拥有的.



window.addEventListener("load", function() {
    (function($) {
        $(".field-name .vTextField").on("change",function (event) {
            $('#changelist-form').submit()
        })
        $('#changelist-form').submit(function(event) { // On form submit event
            $.ajax({ // create an AJAX call...
                data: $(this).serialize(), // get the form data
                type: "POST", // GET or POST
                url: $(this).attr('action'), // the file to call
                success: function(response) { // on success..
                    console.log(response)
                },
                error: function(e, x, r) { // on error..
                    console.log(e)
                }
            });
            event.preventDefault()
            return false;
        });
    })(django.jQuery);
})

我可以在网络请求中看到这种触发,并可以验证正在发送的序列化数据是否已更新.响应是200,但当我刷新页面时,数据尚未更新.

UPDATE

推荐答案

在您的管理模型中添加以下内容

class ExampleAdmin(admin.ModelAdmin):

    class Media:
       js = ("js/admin/example.js")

    list_display = [
        "name",
        "hide"
    ]

    list_editable = [
        "name",
        "hide"
    ]

example.js

window.addEventListener("load", function() {
    (function($) {
        $(".field-name .vTextField").on("change",function (event) {
            submit()
        })
        
        function getFormData($form){
            var unindexed_array = $form.serializeArray();
            var indexed_array = {};
            $.map(unindexed_array, function(n, i){
                indexed_array[n['name']] = n['value'];
            });
            return indexed_array;
        }

        function submit(){
            $.ajax({ 
                data: getFormData($('#changelist-form')),
                type: "POST",
                url: '/api/save-example',
                success: function(response) { 
                    console.log(response)
                },
                error: function(e, x, r) { 
                    console.log(e)
                }
            });
        }

    })(django.jQuery);
})

我使用的是Django Rest框架,所以我创建了一个POST端点,但您也可以在正在侦听POST的Django视图中执行此操作.

当执行post Django时,它将发送按行号和字段名分类的数据,如下所示.

form-0-id : 1
form-0-name: example-name
form-0-hide: false
form-0-example_parent: 100

form-1-id : 2
form-1-name: example-name-two
form-1-hide: true
form-1-example_parent: 200
@api_view(["POST"])
def save_example(request):

    try:
        total_rows = int(request.POST.get("form-TOTAL_FORMS"))
        prefix = "form-"
        form_fields = {
            "id": "id",
            "name": "name",
            "hide": "hide",
            "example_parent": "example_parent_id",
        }

        for x in range(total_rows):
            item = {}
            for key, val in form_fields.items():
                post_field = prefix + str(x) + "-" + key
                field = val
                if key == "id":
                    id = request.POST.get(post_field)
                else:
                    item[field] = request.POST.get(post_field)

            Example.objects.filter(id=id).update(**item)

        return Response(status=status.HTTP_200_OK)

    except Exception as e:
        return Response(status=status.HTTP_404_NOT_FOUND)

100

total_rows = int(request.POST.get("form-TOTAL_FORMS")),让您知道如何循环传递回的所有表单数据.

这并没有考虑到不同的价值观.(即,复选框将返回on个值,但如果未选中,则不会返回任何值.).

您需要相应地更新save_示例函数.

Django相关问答推荐

如何在django模板中渲染标签集

Django中有修改字段值的挂钩吗?

Django Form初始值不在呈现上起作用

如何保护单个数据库行/模型实例?

情节主题更改问题

Django: 无法将我的 comments 关联到特定产品

Django 长时间运行带有线程/处理的异步任务

在 GoDaddy 上安装 django 站点

将计数字段添加到 django rest 框架序列化程序

将 **kwargs 传递给 Django 表单

TestCase 类中的 setUpClass、setUpTestData 和 setUp 有什么区别?

测试 Django ModelForm 是否有实例

magic有什么问题?

在基于类的通用视图 CreateView 中访问 request.user 以便在 Django 中设置 FK 字段

Django JavaScript 文件

这是验证 Django 模型字段的方法吗?

Django unique=True 不工作

如何在 Django 中执行批量插入?

django 我们可以在预取相关模型上 Select 一个字段吗?

Django 在 css 文件中使用背景图像的方法