【发布时间】: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_horizontal 仅设置为与标准 ManyToMany 字段一起使用,因此它可能会从 TreeManyToMany 中被丢弃,并且附加普通 filter_horizontal 小部件可能需要更多工作