Как правильно отправить request.user в модельную форму? - PullRequest
0 голосов
/ 08 мая 2019

Я хотел бы обновить конфигурацию устройства, используя форму модели. Мне удалось передать пользователя в форму модели, и я могу выбрать device_id, который принадлежит текущему пользователю. Но когда я отправляю форму, я получаю сообщение об ошибке: init () получил несколько значений для аргумента 'user' Есть ли способ добавить дополнительное поле "your_device" в качестве первого (перед всеми другими полями) формы модели?

Я попытался удалить user = request.user из метода POST в views.py, но затем я получил другую ошибку: Аргумент int () должен быть строкой, байтовоподобным объектом или числом, а не QueryDict

Это мои forms.py:

class ConfigForm(forms.ModelForm):

    your_device = forms.ModelChoiceField(queryset=Device.objects.none())

    class Meta:
        model = Config
        fields = [
                    'location',
                    'meas_pos',
                    'loudest_pos',
                    'spl_range',
                    'weighting',
                    'tx_int',
                    'offset',
                    'limit',
                    'notification']

    def __init__(self, user, *args, **kwargs):
        super(ConfigForm, self).__init__(*args, **kwargs)
        self.fields['your_device'].queryset = Device.objects.filter(Q(customer=user) | Q(admin=user))

и мои views.py:

def config_view(request):
    if request.method == 'POST':
        form = ConfigForm(request.POST, user = request.user)
        if form.is_valid():
            instance = form.save(commit=False)
            object_id = form.cleaned_data.get('your_device')
            id_ = Index.object.get(id=object_id).device_id
            instance.device_id = id_
            index_id=Index.objects.get(device_id=id_)
            instance.cfg_nbr=index_id.current_cfg+1
            index_id.current_cfg=index_id.current_cfg+1
            index_id.cfg_received=False
            index_id.save()
            instance.save()
            messages.success(request, f'Configuration successfully changed!')
    else:
        form = ConfigForm(user=request.user)


    context = {
        'form' : form
    }
    return render(request, 'my_spl/config.html', context)

1 Ответ

1 голос
/ 08 мая 2019

Вы переопределили сигнатуру формы init, так что первый позиционный параметр - user. Поэтому, когда вы передаете request.POST, user=request.user, первый аргумент принимается за пользователя, а затем второй ... также за пользователем, чего не может быть.

Решение не в том, чтобы изменить подпись, а в том, чтобы получить пользователя от kwargs:

def __init__(self, *args, **kwargs):
    user = kwargs.pop('user')
    super(ConfigForm, self).__init__(*args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...