Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ListView中每行的Django管理操作按钮_Javascript_Django_Django Admin - Fatal编程技术网

Javascript ListView中每行的Django管理操作按钮

Javascript ListView中每行的Django管理操作按钮,javascript,django,django-admin,Javascript,Django,Django Admin,在hakibenita的这篇文章中,我在AdminListView中的每一行都有一个操作按钮。这个按钮只需在模型中的一个带有选项的char字段中更改书籍的状态,但我希望它不打开另一页,只需单击按钮,状态就会更改。状态值是从select中选择的,单击action按钮调用javascript来读取select按钮,然后javascript调用admin页面来更改状态。我无法创建表单,因为listview中的每一行都已在表单中。我不想使用管理操作,因为这是每个对象的操作 以下是相关代码: admin.

在hakibenita的这篇文章中,我在AdminListView中的每一行都有一个操作按钮。这个按钮只需在模型中的一个带有选项的char字段中更改书籍的状态,但我希望它不打开另一页,只需单击按钮,状态就会更改。状态值是从select中选择的,单击action按钮调用javascript来读取select按钮,然后javascript调用admin页面来更改状态。我无法创建表单,因为listview中的每一行都已在表单中。我不想使用管理操作,因为这是每个对象的操作

以下是相关代码:

admin.py:
class BookAdmin(admin.ModelAdmin): 
#...

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('changestatus/<str:status>/<int:bookid>', self.admin_site.admin_view(self.change_status), name = 'changestatus'),
            ]
        return custom_urls + urls


    def change_status(self, request, bookid=None, status=None):
        if bookid: 
            book = Book.objects.get(pk=bookid)
            if status == 'available':
                book.status = Book.AVAILABLE
            elif status == 'unavailable':
                book.status = Book.UNAVAILABLE
            book.save()
            
            newStatus = book.get_status_display()
            
            self.message_user(request, 'Changed status to "{}"'.format(newStatus), messages.SUCCESS)

        url = reverse(
            'admin:library_book_changelist',
            current_app=self.admin_site.name,
        )
        return HttpResponseRedirect(url)



   def status_button(self, obj):
            return format_html('{}<br />'
                            '<select id="selectstatus">'
                            '<option value="available-{}">Status available</option>'
                            '<option value="unavailable-{}">Status unavailable</option>'
                            '<button onclick="changestatus()">Change Status</button>',
                            obj.get_status_display(),
                            obj.pk,
                            obj.pk,
                            )
    status_button.short_description = 'Status'


#...


myjs.js:
function changestatus(){
    var val=document.getElementById("selectstatus").value;
    var valArr = val.split("-");
    var newstatus = valArr[0];
    var bookid = valArr[1];
    changestatusUrl = "/management/library/book/changestatus/"+newstatus+"/"+bookid; 
//     window.open(changestatusUrl, '_self'); // works, changes status but don't display message
//     window.open(changestatusUrl,); // IT WORKS!! but opens another tab
    window.location.replace(changestatusUrl);  // works, changes status but don't display message
}

非常感谢

您是否可以在dajngo管理员列表中创建状态字段和可编辑字段@这不是一个坏主意,但如何控制谁可以更改该字段的权限?好问题-如果只是能够更新该字段或不更新该字段之类的细节,我想你可以覆盖保存,并在其中检查权限之类的内容?签入保存工作,但是每个人都看到选择下拉列表来更改。。。我希望拥有正确权限的人只看到更改下拉列表