django - 如何限制 ForeignKey/ManyToMany Wagtail ModelAdmin 字段中显示的项目?
问题描述
我想限制管理员中显示ManyToManyField
的用户数量。Wagtail
在django
版本中ModelAdmin
,实现以下功能就足够了:
def partner_users_queryset(queryset, field, request):
user = request.user
if queryset and field == "users":
return queryset.filter(groups__pk__in=user.groups.all())
return queryset
@django_admin.register(Partner)
class PartnerAdmin(django_admin.ModelAdmin):
...
def get_field_queryset(self, db, db_field, request):
queryset = super().get_field_queryset(db, db_field, request)
return partner_users_queryset(queryset, db_field.name, request)
有没有办法Wagtail
限制ManyToManyField
s 中显示的值?
解决方案
目前似乎没有直接的方法可以在wagtail
. 有点等效的代码如下所示:
from wagtail.contrib.modeladmin.options import ModelAdmin
from wagtail.contrib.modeladmin.views import CreateView, EditView
class ModelFormMixin:
def get_form(self):
form = super().get_form()
return self.model_admin.custom_model_form(self, form)
class ModelFormCreateView(ModelFormMixin, CreateView):
pass
class ModelFormEditView(ModelFormMixin, EditView):
pass
class ModelFormModelAdmin(ModelAdmin):
create_view_class = ModelFormCreateView
edit_view_class = ModelFormEditView
def custom_model_form(self, view_instance, form):
return form
class PartnerAdmin(ModelFormModelAdmin):
...
def custom_model_form(self, view_instance, form):
if not isinstance(view_instance, (ModelFormCreateView, ModelFormEditView)):
return form
user = view_instance.request.user
queryset = form.fields["users"].queryset
form.fields["users"].queryset = queryset.filter(groups__pk__in=user.groups.all())
return form
推荐阅读
- javascript - 异步函数在构建数据的对象之前返回
- angular - 如何将对象值映射到可观察数组
- r - 如何使用 r 中的信号样本向量的移位版本创建矩阵?
- opencv - OpenCV 3.2 已安装但无法使用。每次加载版本 4.0
- laravel - 如何使用 Laravel API 身份验证返回未授权
- gridview - Flutter:在 GridView 下方添加项目
- r - 如何在数据资源管理器的 plot_missing() 函数中更改颜色和波段标签
- java - 如何使用 split() 分割一条线
- python - 表单不验证并且没有错误。包含 CSRF 令牌
- python - 就地改变声波:频率和幅度