我有一个菜单项,其中包含4种资源,每种语言,如果用户转到EnResources,我希望它仅显示语言字段包含“ en”且与其他语言相同的“资源”。因此,问题在于,无论我选择哪个菜单项始终都是en项目,而仅是获取en项目,而不是FrResources或其他任何项目。
我正在关注文档http://docs.wagtail.io/en/v2.5.1/reference/contrib/modeladmin/indexview.html#modeladmin-get-queryset
Models.py
class Resource(models.Model):
language = models.CharField(max_length=255, choices=constants.LANGUAGES)
title = models.CharField(blank=True, max_length=255)
resource_type = models.CharField(
choices=constants.RESOURCE_TYPES,
max_length=255
)
description = models.TextField()
link = StreamField(
blocks.BasicLinkBlock(max_num=1),
blank=True,
)
panels = [
FieldPanel('language'),
FieldPanel('title'),
FieldPanel('resource_type'),
FieldPanel('description'),
StreamFieldPanel('link'),
]
constants.py
RESOURCE_TYPES = (
('Documentation', 'Documentation'),
('Whitepaper', 'Whitepaper'),
('Webinar', 'Webinar'),
('Video', 'Video'),
('Testimonial', 'Testimonial'),
('ProductSheet', 'ProductSheet'),
)
LANGUAGES = (
('en', 'English'),
('fr', 'French'),
('be-fr', 'Belgique'),
('be-nl', 'Nederlands'),
)
WagtailHooks.py
class ResourceAdmin(ModelAdmin):
model = models.Resource
menu_label = 'Resources'
menu_icon = 'snippet' # change as required
list_display = (
'resource_type',
'title',
)
list_filter = (
'resource_type',
)
search_fields = (
'title',
'business_email',
)
class EnResourceAdmin(ResourceAdmin):
menu_label = 'English Resources'
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.filter(language='en')
class FrResourceAdmin(ResourceAdmin):
menu_label = 'French Resources'
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.filter(language='fr')
class BeResourceAdmin(ResourceAdmin):
menu_label = 'Belgium Resources'
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.filter(language='be-fr')
class NlResourceAdmin(ResourceAdmin):
menu_label = 'Nederlands Resources'
def get_queryset(self, request):
qs = super().get_queryset(request)
return qs.filter(language='be-nl')
class ResourceAdminGroup(ModelAdminGroup):
menu_label = 'Resources'
menu_icon = 'snippet' # change as required
menu_order = 1000 # (000 being 1st, 100 2nd)
items = (
EnResourceAdmin,
FrResourceAdmin,
BeResourceAdmin,
NlResourceAdmin,
)
modeladmin_register(ResourceAdminGroup)
编辑: 我开始做更多研究,并根据default_manager上的Django文档发现了这一点。 https://docs.djangoproject.com/en/2.2/topics/db/managers/#django.db.models.Model._default_manager
如果使用自定义Manager对象,请注意第一个Manager Django遇到(按照在模型中定义的顺序) 具有特殊地位。 Django会解释在 类作为“默认”管理器,以及Django的多个部分(包括 dumpdata)将专门针对该模型使用该Manager。作为一个 因此,最好选择默认值 管理器以避免覆盖get_queryset()的情况 导致无法检索您要使用的对象。
您可以使用以下命令指定自定义默认管理器 Meta.default_manager_name。
如果您要编写一些必须处理未知模型的代码,则 例如,在实现通用视图的第三方应用程序中,请使用此 管理器(或_base_manager),而不是假设模型具有 对象管理器。
请注意第一段的最后一部分。我认为这就是这里正在发生的事情。
答案 0 :(得分:0)
这是一个很好的问题,最近我也遇到了类似的问题。
您将第一个管理器用作默认管理器是正确的。一种获得所需结果的好方法是为每种情况Resource
定义proxy models,并为每种代理模型添加custom managers。然后,您可以修改get_queryset
以仅返回其中language = 'some language'
的实例。