Javascript ListView中每行的Django管理操作按钮
在hakibenita的这篇文章中,我在AdminListView中的每一行都有一个操作按钮。这个按钮只需在模型中的一个带有选项的char字段中更改书籍的状态,但我希望它不打开另一页,只需单击按钮,状态就会更改。状态值是从select中选择的,单击action按钮调用javascript来读取select按钮,然后javascript调用admin页面来更改状态。我无法创建表单,因为listview中的每一行都已在表单中。我不想使用管理操作,因为这是每个对象的操作 以下是相关代码:Javascript ListView中每行的Django管理操作按钮,javascript,django,django-admin,Javascript,Django,Django Admin,在hakibenita的这篇文章中,我在AdminListView中的每一行都有一个操作按钮。这个按钮只需在模型中的一个带有选项的char字段中更改书籍的状态,但我希望它不打开另一页,只需单击按钮,状态就会更改。状态值是从select中选择的,单击action按钮调用javascript来读取select按钮,然后javascript调用admin页面来更改状态。我无法创建表单,因为listview中的每一行都已在表单中。我不想使用管理操作,因为这是每个对象的操作 以下是相关代码: admin.
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管理员列表中创建状态字段和可编辑字段@这不是一个坏主意,但如何控制谁可以更改该字段的权限?好问题-如果只是能够更新该字段或不更新该字段之类的细节,我想你可以覆盖保存,并在其中检查权限之类的内容?签入保存工作,但是每个人都看到选择下拉列表来更改。。。我希望拥有正确权限的人只看到更改下拉列表