У меня проблема с исключением поля, если у пользователя есть определенный атрибут.

Я пытаюсь выполнить тест, используя параметр is_staff после этот совет, но я не могу заставить его работать. Я получаю сообщение об ошибке: __init__() got an unexpected keyword argument 'user'

Может ли кто-нибудь сказать мне, как исключить некоторые поля, если пользователь является штатным, пожалуйста?

Это моя форма в forms.py

class NewOrderForm(forms.ModelForm):

    class Meta:
        model = WorkOrder
        fields = ['store_internal_order',
                  'sector',
                  'article',
                  'serial',
                  'work',
                  'article_details',
                  'cash_advance',
                  'initial_price'
                  ]

    def __init__(self, *args, **kwargs):
        super(NewOrderForm, self).__init__(*args, **kwargs)
        user = kwargs.pop('user')
        if user.is_staff:
           del self.fields['store_internal_order']

И это мой взгляд

def new(request):
    if not request.user.is_authenticated():
        return redirect('auth_login')

    title = "Nueva Orden de trabajo"
    store = request.user.userprofile.fk_store
    form = NewOrderForm(request.POST or None)
    context = {"title": title,
               "form": form}

    if 'dni_cuit' in request.session:
        dni_cuit = request.session.get('dni_cuit')
        if Client.objects.get(dni_cuit=dni_cuit):
            dni_cuit = request.session.pop('dni_cuit')
            client = Client.objects.get(dni_cuit=dni_cuit)

            context.update({'client': client})
            request.session['dni_cuit'] = dni_cuit
        else:
            return redirect('new_client')

    # Si el formulario es valido guardamos el contenido
    if form.is_valid():
...
...
...

Большое спасибо, кто может мне помочь.

Извините за мой плохой английский!

3
marcosgue 11 Авг 2015 в 06:08

2 ответа

Вы на правильном пути, но ваше утверждение user = kwargs.pop('user') находится в неправильном месте. Его следует вызывать перед super(NewOrderForm, self).__init__(*args, **kwargs). Причина возникновения этой ошибки заключается в том, что в классе базовой формы метод __init__() не ожидает принятия вашего параметра user. Таким образом, нам нужно сначала извлечь его и сохранить в переменной, а затем вызвать super.

После исправления:

class NewOrderForm(forms.ModelForm):

    class Meta:
        model = WorkOrder
        fields = ['store_internal_order',
                  'sector',
                  'article',
                  'serial',
                  'work',
                  'article_details',
                  'cash_advance',
                  'initial_price'
                  ]

    def __init__(self, *args, **kwargs):
        # user should be popped here
        user = kwargs.pop('user', None)
        super(NewOrderForm, self).__init__(*args, **kwargs)
        # just in case your user is empty
        if user and user.is_staff:
           del self.fields['store_internal_order']
3
Shang Wang 11 Авг 2015 в 17:21

Не уверен, что это поможет, но должно ли user = kwargs.pop('user') быть user = kwargs.pop('user', None)? Также вы пытались передать user=request.user в качестве параметра в NewOrderForm?

0
thevengefulco 11 Авг 2015 в 06:59