Скрыть поле из django ModelForm в зависимости от профиля пользователя - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть форма с двумя полями (почта и статус). Я хочу, чтобы поле состояния было скрыто, только если у пользователя есть профиль, не равный «tech», так что пользователь не может изменить его значение в этом случае.

Что я пытался сделать, но я все еще не сделалне заставить его работать, так как он выдает мне TypeError error: __init __ () got an unexpected keyword argument 'user', это перезаписать метод __init __ () RequestForm в forms.py и, с другой стороны, переписать метод get_form_kwargs (), чтобы передать пользователя в форму. Я публикую код, который мне понятен:

views.py:

...
class RequestUpdate(UpdateView):
    model = Request
    form_class = RequestForm
    template_name = 'request/request_form.html'
    success_url = reverse_lazy('request:request_list')

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

forms.py:

class RequestForm(forms.ModelForm):

    class Meta:
        model = Request
        fields = [
            'mail',
            'status',
        ]
        labels = {
            'mail': 'E-Mail (including @domain.example)',
            'status': "Request's status:"
        }
        widgets = {
            'mail': forms.EmailInput(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        if self.user.is_tech == False:
            self.fields.pop('status')

models.py

...
class Request(models.Model):
   mail = models.CharField(max_length=50)
   states = [('1','Pending'), ('2','In process'), ('3','Done')]
   status = models.CharField(max_length=50, choices=states, default='1')
   user = models.ManyToManyField(Requester, blank=True)

Почему возникает ошибка * unexpected keyword argument 'user' *? Какие предложения вы могли бы сделать, чтобы скрыть это поле в соответствии с профилем пользователя?

1 Ответ

0 голосов
/ 04 ноября 2019

Я бы предложил переопределить только метод get_form, как описано в RequestUpdate:

def get_form(self, *args, **kwargs):
    form = super().get_form(self.form_class)
    if not self.request.user.status.is_tech:
        form.fields.pop('status')
    return form

Я не знаю, почему ваш код дает сбой, но в любом случае вы можете настроить форму в классе представления, так что нет необходимости делать этобольше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...