向Wagtail仪表板添加按钮 [英] Adding a button to Wagtail Dashboard

查看:68
本文介绍了向Wagtail仪表板添加按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以如图所示在顶部面板上添加其他按钮(按钮)?

Is it possible to add a additional button(buttons) on the top panel as shown in the picture?

我在Google和此处都找不到任何内容。

I did't find anything in Google and here.

推荐答案

在屏幕快照上不清楚是使用 modeladmin 还是片段将模型展示给用户,但我会假设是前者。

It is not clear on the screenshot whether you use modeladmin or the snippets to expose this model to the user but I'll assume the former.

我不知道一个允许您直接向标题添加按钮的钩子。模板使用块应该可以覆盖这部分。

I don't know about a hook which allows you to add buttons directly to the header, however the template uses blocks which should allow us to overwrite just this part.

我们可以利用解析顺序并创建 / modeladmin / app-name / model-name /index.html 优先于 /modeladmin/index.html 。因此,使用名为 feedler 的应用和名为 Entry 的模型,创建 / modeladmin / feedler /entry/index.html 并包含以下内容:

We can take advantage of the resolution order of the templates and create /modeladmin/app-name/model-name/index.html which will take precedence over /modeladmin/index.html. So given with your app called feedler and a model called Entry, create /modeladmin/feedler/entry/index.html with the following content:

{% extends "modeladmin/index.html %}

{% block header_extra %}
    <a href="#">My New Button</a>
    {{ block.super }}{% comment %}Display the original buttons {% endcomment %}
{% endblock %}

现在您的按钮作用不大。要创建将与该模型管理员交互的动作,您需要创建一些按钮/ URL /权限帮助器和一个视图。

Right now your button doesn't do much. To create an action which will interact with that model admin, you'll need to create some button/url/permission helpers and a view.

让我们说一下,该操作是将对象导出到CSV文件。做好准备,自己准备好很多代码。

Let's say the action is exporting the objects to a CSV file. Brace yourself, there's quite a bit of code ahead.

/ feedler中/admin.py ,创建按钮/ url /权限帮助器并查看:

In /feedler/admin.py, create the button/url/permission helpers and view:

from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.utils.decorators import method_decorator
from django.utils.functional import cached_property
from django.utils.translation import ugettext as _
from wagtail.contrib.modeladmin.helpers import AdminURLHelper, ButtonHelper
from wagtail.contrib.modeladmin.views import IndexView


class ExportButtonHelper(ButtonHelper):
    """
    This helper constructs all the necessary attributes to create a button.

    There is a lot of boilerplate just for the classnames to be right :(
    """

    export_button_classnames = ['icon', 'icon-download']

    def export_button(self, classnames_add=None, classnames_exclude=None):
        if classnames_add is None:
            classnames_add = []
        if classnames_exclude is None:
            classnames_exclude = []

        classnames = self.export_button_classnames + classnames_add
        cn = self.finalise_classname(classnames, classnames_exclude)
        text = _('Export {}'.format(self.verbose_name_plural.title()))

        return {
            'url': self.url_helper.get_action_url('export', query_params=self.request.GET),
            'label': text,
            'classname': cn,
            'title': text,
        }


class ExportAdminURLHelper(FilterableAdminURLHelper):
    """
    This helper constructs the different urls.

    This is mostly just to overwrite the default behaviour
    which consider any action other than 'create', 'choose_parent' and 'index'
    as `object specific` and will try to add the object PK to the url
    which is not what we want for the `export` option.

    In addition, it appends the filters to the action.
    """

    non_object_specific_actions = ('create', 'choose_parent', 'index', 'export')

    def get_action_url(self, action, *args, **kwargs):
        query_params = kwargs.pop('query_params', None)

        url_name = self.get_action_url_name(action)
        if action in self.non_object_specific_actions:
            url = reverse(url_name)
        else:
            url = reverse(url_name, args=args, kwargs=kwargs)

        if query_params:
            url += '?{params}'.format(params=query_params.urlencode())

        return url

    def get_action_url_pattern(self, action):
        if action in self.non_object_specific_actions:
            return self._get_action_url_pattern(action)

        return self._get_object_specific_action_url_pattern(action)


class ExportView(IndexView):
    """
    A Class Based View which will generate 
    """

    def export_csv(self):
        data = self.queryset.all()
        response = ...
        return response


    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request, *args, **kwargs)
        return self.export_csv()


class ExportModelAdminMixin(object):
    """
    A mixin to add to your model admin which hooks the different helpers, the view
    and register the new urls.
    """

    button_helper_class = ExportButtonHelper
    url_helper_class = ExportAdminURLHelper

    export_view_class = ExportView

    def get_admin_urls_for_registration(self):
        urls = super().get_admin_urls_for_registration()
        urls += (
            url(
                self.url_helper.get_action_url_pattern('export'),
                self.export_view,
                name=self.url_helper.get_action_url_name('export')
            ),
        )

        return urls

    def export_view(self, request):
        kwargs = {'model_admin': self}
        view_class = self.export_view_class
        return view_class.as_view(**kwargs)(request)

/feedler/wagtail_hooks.py 中,创建并注册 ModelAdmin

from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register

from .admin import ExportModelAdminMixin
from .models import Entry

class EntryModelAdmin(ExportModelAdminMixin, ModelAdmin):
    model = Entry
    # ...

modeladmin_register(EntryModelAdmin)

通过所有设置,您应该能够在上面创建的模板中使用 {%include'modeladmin / includes / button.html'和button = view.button_helper.export_button%}

With all that setup, you should be able to use {% include 'modeladmin/includes/button.html' with button=view.button_helper.export_button %} in the template created above.

这篇关于向Wagtail仪表板添加按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆