Динамическая настройка edit_handler в зависимости от типа пользователя - PullRequest
0 голосов
/ 15 ноября 2018

В моем приложении есть несколько моделей, которые можно редактировать с помощью modelAdmin.Возможно ли, что некоторые полевые панели скрыты для некоторых типов пользователей?

Я не могу найти в документации, как динамически изменять обработчик edit_handler в зависимости от типа пользователя.

Ответы [ 5 ]

0 голосов
/ 17 июня 2019

Другой подход.Заставьте метод required_fields вернуть пустой список.

# panels.py
from wagtail.admin.edit_handlers import FieldPanel


class PermissionFieldPanel(FieldPanel):
    def __init__(self, *args, permission: str, **kwargs):
        super().__init__(*args, **kwargs)
        self.permission = permission

    def clone_kwargs(self):
        kwargs = super().clone_kwargs()
        kwargs['permission'] = self.permission
        return kwargs

    def required_fields(self):
        if self.request and self.request.user.has_perm(self.permission):
            return super().required_fields()
        return []

# models.py
from wagtail.core.models import Page

form panels import PermissionFieldPanel


class ArticlePage(Page):
    admin_notes = models.TextField(blank=True)

    settings_panels = Page.settings_panels + [
         PermissionFieldPanel('admin_notes', permission='myapp__some_permission'),   
    ]

0 голосов
/ 24 ноября 2018

В дополнение к ответу выше (не могу добавить комментарий к нему извините).

Вместо render_as_field иногда вам следует использовать render_as_object.Это зависит.

0 голосов
/ 22 ноября 2018

Есть еще один способ, который я недавно обнаружил (тоже столкнулся с этой проблемой).Если вам не нужно скрывать панель, а только сделать ее доступной только для чтения, вы можете просто создать, скажем, NewFieldPanel унаследованный от базового FieldPanel и переопределить bind_to_instance метод (изначально нашла подсказку здесь ).

Пример реализации:

class NewFieldPanel(FieldPanel):
    def bind_to_instance(self, instance=None, form=None, request=None):
        # form.fields['managers'].widget = HiddenInput()
        form.fields['managers'].disabled = True
        return super().bind_to_instance(
            instance=instance, form=form, request=request
        )
0 голосов
/ 22 ноября 2018

... сейчас, если бы это было я, Я бы, вероятно, решил установить две совершенно разные панели, даже если бы они сохранялись вместе и выглядели одинаково. Потому что «рано или поздно» одно представление будет отличаться от другого, и это может очень быстро добавить сложность. Поэтому, хотя вы можете обратиться к этой проблеме, «выборочно скрывая вещи», вы можете прийти к выводу, что вы не сделали этого таким образом. Я думаю, что лучше иметь две избыточные панели с чистой реализацией для каждой, чем иметь два куска кода, которые напичканы if утверждениями ... но это строго мое мнение.

0 голосов
/ 19 ноября 2018

Вы можете подкласс FieldPanel и переопределить методы render_as_field и / или render_as_object.В рамках этих методов у вас будет доступ к запросу, который привязан к модели в bind_to_instance (см. https://github.com/wagtail/wagtail/blob/master/wagtail/admin/edit_handlers.py#L137).

Вот пример:

from wagtail.admin.edit_handlers import FieldPanel


class CustomFieldPanel(FieldPanel):

    def render_as_field(self):
        if not self.request.user.is_superuser:
            return ''
        return super().render_as_field()
...