【问题标题】:Move Wagtail Admin list_filter on header - List Filter covering table data在标题上移动 Wagtail Admin list_filter - 覆盖表格数据的列表过滤器
【发布时间】:2020-05-22 09:50:59
【问题描述】:

我有一个模型,其中显示了图像中的字段。我在 wagtail_hooks.py 中创建了以下 ModelAdmin。

class opportunitiesAdmin(ModelAdmin):
    model = opportunities
    menu_label='Opportunities'
    menu_icon='fa-briefcase'
    list_display = ['reference_no','stage','opportunity_name','expected_value','probability','BDM','sector_code','service_code','source_code','date_entered','close_date']
    list_filter = ('stage',)
    menu_order=435

问题是列表过滤器覆盖了数据。我想知道我可以将此列表过滤器作为下拉列表移动到标题。

【问题讨论】:

    标签: python wagtail django-admin-filters wagtail-admin


    【解决方案1】:

    很好的问题,我认为这可能是 Wagtail 的 ModelAdmin 的一个潜在问题,提出一个问题可能会很好。有一个与“折叠状态”here 相关的类似问题。

    选项 1 - CSS 解决方法

    一种快速的、仅限 css 的解决方法是将内容“移动”到按钮附近的顶部。您可能想要改进以在不同的视口断点内工作,而且这不是最容易访问的解决方案,但它可以让您快速到达那里。

    您可以通过 index_view_extra_css 将 css 添加到 ModelAdmin 索引列表中。

    下面的示例方法假设这是桌面视图,用户可以“悬停”在移动到标题的列表过滤器上。

    wagtail_hooks.py
    class opportunitiesAdmin(ModelAdmin):
        model = opportunities
        #...
        index_view_extra_css = ('css/modeladmin-index.css',)
    
    static/css/modeladmin-index.css
    @media screen and (min-width: 50em) {
      .changelist-filter {
        position: fixed;
        top: 0;
        right: 15rem;
        z-index: 1;
        background: white;
        transform: translateY(-100vh);
      }
    
      .changelist-filter h2 {
        margin-top: 1rem;
        transform: translateY(100vh);
      }
    
      .changelist-filter:hover {
        transform: none;
      }
    
      .changelist-filter:hover h2 {
        margin-top: 0;
        transform: none;
      }
    }
    

    选项 2 - 修改模板

    您可以更进一步,修改使用的模板(基于每个模型或所有索引页面)。请参阅ModelAdmin Overriding Templates docs。

    对于底层的index.html模板,您可以查看contrib/modeladmin/templates/modeladmin/index.html的来源。

    下面的示例扩展了默认的索引模板,并使块filters 不呈现任何内容。然后,查看源代码,复制过滤器的渲染方式并将它们放入块 header_extra

    首先,内容已被放入具有属性data-dropdown 的div 中,该属性将在下拉列表中呈现内部内容,第一个元素是“触发器”,第二个元素是选项。

    注意:这是一个粗略的示例,需要进一步的样式和元素属性。

    templates/modeladmin/index.html
    {% extends 'modeladmin/index.html' %}
    {% load i18n modeladmin_tags %}
    
    {% block header_extra %}
    
      {% if view.has_filters and all_count %}
        <div {{ self.attrs }} class="c-dropdown" data-dropdown>
          <a href="javascript:void(0)" class="c-dropdown__button u-btn-current">
            <strong>{% trans 'Filter' %}</strong>
            <div data-dropdown-toggle="" class="o-icon c-dropdown__toggle [ icon icon-arrow-down ]"></div>
          </a>
          <div class="c-dropdown__menu u-toggle u-arrow u-arrow--tl u-background">
            {% for spec in view.filter_specs %}{% admin_list_filter view spec %}{% endfor %}
          </div>
        </div>
      {% endif %}
    
      {{ block.super }}
    {% endblock %}
    
    {% block filters %}
      {% comment %} make content blank {% endcomment %}
    {% endblock %}
    

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 2012-10-18
      • 2020-05-21
      • 2012-09-13
      • 2012-05-15
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      相关资源
      最近更新 更多