我可以从摇尾页面按钮触发python中的操作吗

2024-04-28 12:00:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在wagtail中,可以使用^{}钩子向页面添加按钮

然而,这些示例只是将您带到您选择的url

在我的例子中,我有一个ProjectPage模型,还有一个函数regenerate_project_geo_features()(目前是一个管理命令,尽管不需要)

我想要一个按钮,无论是在页面列表中还是在页面编辑视图本身中,都可以用来触发python中的操作

是否可以修改这个钩子,或者使用另一个我不知道的钩子,在python中简单地调用函数?(最好使用一些参数,如ProjectPage{},告诉函数调用了哪个页面)?


Tags: 函数模型命令projecturl示例页面按钮
1条回答
网友
1楼 · 发布于 2024-04-28 12:00:28

实现这一点的一种方法是使用Javascript,本质上是向被单击的链接/按钮添加一个侦听器。然后,这将触发对您管理的URL的某种POST请求,该URL将执行再生的“工作”

本质上,由于这是一个web框架(Django),所以所有内容都应该被视为一组具有请求/响应处理的视图(页面)

接近

  • 创建自定义管理员URL&;视图(仅可通过管理员有意访问)
  • 此视图基本上可以处理POST请求,当使用页面id调用时,它将完成您需要的工作
  • 链接现在变成了一个按钮,点击它将调用Javascript^{}(发生在后台)
  • 然后可以更新视图,以便在后台对页面执行任何操作
  • 注意:示例比较粗糙,没有任何错误处理或向用户发送消息(即,当用户单击它时,他们不知道它是否工作/完成等)

示例代码

  • 这将在您的wagtail_hooks.py文件中
from django.conf.urls import url
from django.http import HttpResponse
from django.urls import reverse
from django.utils.html import format_html
from django.views.decorators.http import require_http_methods
from django.views.decorators.csrf import csrf_exempt

from wagtail.admin.widgets import PageListingButton
from wagtail.core import hooks


@csrf_exempt # not recommended - but helpful to get to the POC stage
@require_http_methods(["POST"])
def regnerate_admin_features(request):
    page_pk = request.GET.get('id', '')
    # do whatever you need here with the PK to process the action

    return HttpResponse(
        "Success/Error handling goes here",
        content_type="text/plain")

@hooks.register('register_admin_urls')
def urlconf_time():
  return [
    url(r'^regenerate_geo_features/$', regnerate_admin_features, name='regenerate_geo_features'),
  ]

@hooks.register('register_page_listing_buttons')
def page_listing_buttons(page, page_perms, is_parent=False):

    attrs = {
        'data-id': page.pk, # note - may want to html encode this for a more secure implementation
    }

    yield PageListingButton(
        'Regenerate Geo Features',
        reverse('regenerate_geo_features'),
        attrs=attrs,
        classes=["action-regenerate-geo-features"],
        priority=100
    )

@hooks.register('insert_global_admin_js')
def global_admin_js():
    # note - this is very rough, no error, loading or sucess messaging
    # reminder - using format_html means all `{` must be written as `{{`
    return format_html(
        """
        <script>
        const onClickHandler = function(event) {{
            event.preventDefault(); // ensure the hash does not change
            const url = event.target.href + '?id=' + event.target.dataset.id;
            console.log('button clicked - about to POST to URL:', url);
            fetch(url, {{
                method: 'POST', // or 'PUT'
            }})
        }};

        window.addEventListener('DOMContentLoaded', function(event) {{
            const actionButtons = Array.from(document.getElementsByClassName('action-regenerate-geo-features'));

            actionButtons.forEach(function(element) {{
                element.addEventListener('click', onClickHandler);
            }});
        }});
        </script>
        """,
    )

相关问题 更多 >