在 Wagtail 的 ModelAdmin 中,可以通过重写 get_queryset
方法来限制在 ForeignKey/ManyToMany 字段中显示的项。
对于 ForeignKey 字段,可以使用 limit_choices_to
参数来指定限制条件。例如,假设有一个 Author
模型和一个 Book
模型,Book
模型有一个 author
字段,可以通过以下方式限制 author
字段中显示的选项:
from django.db import models
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
from myapp.models import Book
class BookAdmin(ModelAdmin):
model = Book
menu_label = 'Books'
menu_icon = 'book'
menu_order = 200
add_to_settings_menu = False
exclude_from_explorer = False
list_display = ('title', 'author')
def get_queryset(self, request):
qs = super().get_queryset(request)
# 限制 author 字段中只显示姓氏为 "Smith" 的作者
qs = qs.filter(author__last_name='Smith')
return qs
modeladmin_register(BookAdmin)
对于 ManyToMany 字段,可以使用 formfield_for_manytomany
方法来限制显示的选项。例如,假设有一个 Book
模型有一个 authors
字段,可以通过以下方式限制 authors
字段中显示的选项:
from django.db import models
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
from myapp.models import Book
class BookAdmin(ModelAdmin):
model = Book
menu_label = 'Books'
menu_icon = 'book'
menu_order = 200
add_to_settings_menu = False
exclude_from_explorer = False
list_display = ('title', 'authors')
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == 'authors':
# 限制 authors 字段中只显示姓氏为 "Smith" 的作者
kwargs['queryset'] = db_field.remote_field.model.objects.filter(last_name='Smith')
return super().formfield_for_manytomany(db_field, request, **kwargs)
modeladmin_register(BookAdmin)
以上示例中,get_queryset
方法和 formfield_for_manytomany
方法都用于限制显示的选项,可以根据具体需求进行修改。
领取专属 10元无门槛券
手把手带您无忧上云