【问题标题】:Django Admin filter_horizontal not workingDjango Admin filter_horizo​​ntal 不起作用
【发布时间】:2015-09-08 00:15:38
【问题描述】:

我正在尝试使过滤器水平以包括搜索和选定的框划分,而不是您使用 ctrl 多个选项选择的单列。

我在 admin.py 中包含了水平过滤器,但它不起作用。我正在使用从 admin.ModelAdmin 导入的公共类,是否会因此出现问题?

class ArticleAdmin(CommonAdmin):
    form = autocomplete_light.modelform_factory(Article)
    list_display = [
        'name',
        'categories_display',
        'modified_by',
        'created_by',
        'modified',
        'created',
        'visible',
    ]
    list_editable = ['visible']
    filter_horizontal = ('categories','tags')
    #list_filter = ('categories',)
    excludes = ['sortorder',]
    inlines = [
        HotItemInline,
        ArticleImageInline,
        ArticleYoutubeVideoInline,
        #RelatedArticleInline
    ]

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "categories":
            try:
                category_root = Category.objects.get(slug='lifestyle')
                kwargs["queryset"] = Category.objects.filter(tree_id=category_root.tree_id).exclude(id=category_root.id)
            except Category.DoesNotExist:
                pass
        return super(CommonAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

普通管理员

class CommonAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.ImageField: {'widget': PreviewImageWidget},
    }
    list_display = ['name', 'modified_by', 'created_by', 'modified', 'created', 'visible', 'get_absolute_url']
    search_fields = ['name', ]
    list_filter = ['modified', 'created', 'visible']
    ordering = ['-modified',]
    actions=[make_invisible, make_visible,]
    list_select_related = True

    class Media:
        js = (
            "/static/kb/js/admin/timeoptions.js",
        )

    def changelist_view(self, request, extra_context=None):
        if not request.GET.has_key('visible__exact'):
            q = request.GET.copy()
            q['visible__exact'] = 1
            request.GET = q
            request.META['QUERY_STRING'] = request.GET.urlencode()
        return super(CommonAdmin,self).changelist_view(request, extra_context=extra_context)

    def save_model(self, request, obj, form, change):
        if not obj.id:
            obj.created_by = request.user
            obj.created = datetime.datetime.today()
        obj.modified_by = request.user
        obj.modified = datetime.datetime.today()
        if hasattr(obj, 'name') and hasattr(obj, 'header') and hasattr(obj, 'title'):
            if not obj.header:
                obj.header = obj.name
            if not obj.title:
                obj.title = obj.name
        obj.save()

和模型

class Article(BaseItemModel):
    area = TreeForeignKey(Area, blank=True, null=True,)
    categories = TreeManyToManyField(Category)
    tags = models.ManyToManyField(Tag, blank=True)
    author = models.CharField(max_length=255, blank=True,)
    html = RichTextField(blank=True, null=True,)

    def share_content(self):
        html = self.html
        if not html:
            html = self.content
        return html.replace('"', "'").strip()

    @models.permalink
    def get_absolute_url(self):
        return ('article_detail', (), {'slug': self.slug})

【问题讨论】:

  • 我的猜测是问题不在于继承的管理类,而是您的类别模型中的自定义模型字段。据我了解,filter_horizo​​ntal 仅设置为与标准 ManyToMany 字段一起使用,因此它可能会从 TreeManyToMany 中被丢弃,并且附加普通 filter_horizo​​ntal 小部件可能需要更多工作

标签: python django


【解决方案1】:

这是一个较老的问题,但我只需要处理同样的情况。答案是在 ModelAdmin 上定义 filter_horizontal 以及直接在 TreeNodeMultipleChoiceField 上设置小部件,它处理 mptt 选项的缩进显示。

这是使用问题中的Article 模型的解决方案:

from django import forms, admin
from mptt.forms import TreeNodeMultipleChoiceField

class ArticleAdminForm(forms.ModelForm):
    categories = TreeNodeMultipleChoiceField(required=False,
        queryset = Category.objects.all(), 
        level_indicator = u'+--',
        widget = admin.widgets.FilteredSelectMultiple('Categories', False))
    class Meta:
        model = Article
        fields = '__all__'

class ArticleAdmin(admin.ModelAdmin):
    filter_horizontal = ('categories',)
    form = ArticleAdminForm

【讨论】:

    猜你喜欢
    • 2019-08-15
    • 2011-07-17
    • 1970-01-01
    • 2011-02-15
    • 2013-08-12
    • 2012-04-24
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多