Django форма на основе ролей - PullRequest
0 голосов
/ 17 июня 2020

У меня два пользователя: клиент и администратор. И у меня есть обновление и форма создания с полем статуса и другими полями. В поле статуса отображается, получен ли заказ, запланирован или находится в производстве. Я хочу, чтобы только администратор обновлял это поле, а покупатель только его просматривал. Может кто подскажет, как это реализовать? Спасибо!

1 Ответ

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

Может быть, вы можете попробовать вот так, переопределив OrderForm:

class OrderForm(ModelForm):
    def __init__(self, *args, **kwargs):
        <b>user = kwargs.pop('user', None)</b>
        super(OrderForm, self).__init__(*args, **kwargs)
        <b>if not user.is_superuser:  # or do admin check
            self.fields['status_choices'].widget.attrs['readonly'] = True</b>

    class Meta:
        model = Order
        fields = '__all__'
        exclude = ['user','date']

Затем передать пользовательский экземпляр через OrderForm при его запуске в представлении:

form = OrderForm(request.POST or None, request.FILES or None,initial=initial_date, <b>user=user</b>)

Обновление

Это может не работать для исходных данных, потому что у него есть выбор, которого нет в choices в поле модели модели Order. Измените его на:

initial_date = {
    'status':"Processing/Manufacturing"
}

Вы также можете добавить его как значение по умолчанию в поле модели:

  status = models.CharField(max_length = 100, choices = status_choices, default="Processing/Manufacturing")

Если вы вообще не хотите отображать в поле, тогда вы можете скрыть его с помощью:

<b>if not user.is_superuser:  # or do admin check
    self.fields['status_choices'].widget.attrs['hidden'] = True</b>

или просто удалить:

<b>if not user.is_superuser:  # or do admin check
    self.fields.pop('status_choices')</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...