首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django管理页在自定义操作按钮上执行javascript

Django管理页在自定义操作按钮上执行javascript
EN

Stack Overflow用户
提问于 2022-04-11 23:09:43
回答 2查看 426关注 0票数 0

我试图在用户旁边的每一行中添加一个自定义按钮到django管理页面,这使得管理员更容易单击该按钮并为特定用户生成密码重置链接,而不是导航到django管理页的隐藏actions部分。

就像这样- https://hakibenita.com/how-to-add-custom-action-buttons-to-django-admin

下面是我实现的代码,它工作并导航到一个具有正确reset-password请求的新页面,reset_password()方法执行时会向用户发送一个链接。

但是,当我单击该按钮时,我希望将一个AJAX GET请求发送到与上面相同的url,并且只是在请求完成时向管理员显示一个警报,而不是导航到一个新页面。目前,我无法使用Django中的format_html方法运行javascript代码(参见下面的代码)

代码语言:javascript
运行
复制
class UserAdmin(Admin.modelAdmin):
    list_display = ('name', 'email', 'custom_actions')

    form = forms.UserAdminForm
  
    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            url(
                r'reset-password/(?P<user_id>.+)',
                self.admin_site.admin_view(self.reset-password),
                name='reset-password',
            ),
        ]
        return custom_urls + urls

    def custom_actions(self, obj):
            user = user_model.User.get(user_id=obj.id)
            password_reset_url = reverse('admin:reset-password', args=[user.id])
            return mark_safe(format_html(
                f'<a class="button" onclick="parent.location=\'{password_reset_url}\'" >Reset Password</a>&nbsp;'
    custom_actions.short_description = 'Custom Actions'
    custom_actions.allow_tags = True


    def reset_password(self, request, password_reset_id):
        password_reset.send_password_reset_link(password_reset_id=password_reset_id)
        return HttpResponse(status=200)

下面是我在页面上测试的HTML/JS代码,我希望在上面的Django代码中加入同样的代码,但是Django无法执行,只是将脚本显示为管理页面上的一个字符串。

代码语言:javascript
运行
复制
<button id='jax' class="button">AJAX</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
  $(document).ready(function() {
    $("#jax").click(function(){
      $.ajax({
        type : "GET",
        url : "my-dynamic-url",
        timeout:10,
        jsonp : "jsonp",
        success : function (response, textS, xhr) {
          console.log('oof')
          alert("Password reset link has been resent");
        },
        error : function (xmlHttpRequest, textStatus, errorThrown) {
          if(textStatus==='timeout')
            alert("request timed out");
        }
      });
    });
  });
</script>

是否有正确的方法来集成上述javascript代码在管理页面上点击按钮?

EN

回答 2

Stack Overflow用户

发布于 2022-04-12 00:45:11

你漏掉逗号了吗?根据文档的一个例子

代码语言:javascript
运行
复制
format_html("{} <b>{}</b> {}",
    mark_safe(some_html),
    some_text,
    some_other_text,
)

也许您应该将{password_reset_url}用逗号括起来,看看它是否有效。

如果这不能解决您的问题,详细说明这一点将是有帮助的:

Django无法执行,只能将脚本显示为管理页上的字符串。

你指的是哪个剧本?

票数 0
EN

Stack Overflow用户

发布于 2022-04-12 15:55:59

解决办法:

Python:

代码语言:javascript
运行
复制
class UserAdmin(Admin.modelAdmin):
    list_display = ('name', 'email', 'custom_actions')

    form = forms.UserAdminForm
  
    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            url(
                r'reset-password/(?P<user_id>.+)',
                self.admin_site.admin_view(self.reset-password),
                name='reset-password',
            ),
        ]
        return custom_urls + urls

    def custom_actions(self, obj):
            user = user_model.User.get(user_id=obj.id)
            password_reset_url = reverse('admin:reset-password', args=[user.id])
            return mark_safe(format_html(
                f'<a class="button" onclick="send_password_link(\'{password_reset_url}\'") >Reset Password</a>&nbsp;'
    custom_actions.short_description = 'Custom Actions'
    custom_actions.allow_tags = True


    def reset_password(self, request, password_reset_id):
        password_reset.send_password_reset_link(password_reset_id=password_reset_id)
        return HttpResponse(status=200)

HTML:这应该在base-app/templates/your-app/change_list.html下面

代码语言:javascript
运行
复制
{% extends "admin/change_list.html" %} 
{% load static %}
{% block content %}
<script src="{% static 'js/passwordReset.js' %}"></script>

<!-- Render the rest of the ChangeList view by calling block.super -->
{{ block.super }} 

{% endblock %}

Javascript:这应该在base-app/static/static/js/passwordReset.js下面

代码语言:javascript
运行
复制
function send_password_link(url) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            alert('Password Reset Sent');
        }
    };
    xhttp.open("GET", url, true);
    xhttp.send();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71835283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档