问题描述
是否可以如图所示在顶部面板上添加其他按钮(按钮)?
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 snippet
s 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仪表板添加按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!