__init __ () получил несколько значений для аргумента, пытающегося переопределить формы. Форма - PullRequest
0 голосов
/ 27 июня 2018

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

form.py

class ChangeMemberForm(forms.Form):
    coordinator = forms.ModelChoiceField(queryset=None,label="Pesquisadores", widget=forms.Select(attrs={'class':'form-control'}))
    def __init__(self,ubc, *args,**kwargs):
        super(ChangeMemberForm, self).__init__(*args,**kwargs)
        ubc = Ubc.objects.get(id=ubc)
        self.fields['coordinator'].queryset = ubc.researchers.all()

view.py

def change_coordinator(request, pk):
    template_name =  'ubc/addmember.html'
    ubc = Ubc.objects.get(pk=pk)
    if request.method == "POST":
        form = ChangeMemberForm(request.POST, ubc=ubc.id)
        if form.is_valid():
            print(form.cleaned_data)
        return redirect('accounts:account_detail', pk=request.user.id)
    form = ChangeMemberForm(ubc=ubc.id)
    context = {
        'form': form,
    }
    return render(request, template_name, context)

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

В django принято передавать данные формы в качестве первого позиционного аргумента при инициализации формы.

Проблема с вашим ChangeMemberForm заключается в том, что ubc объявлен в качестве первого позиционного аргумента. Поэтому при попытке ChangeMemberForm(request.POST, ubc=ubc.id) оба аргумента будут интерпретироваться как ubc, и python выдает исключение.

Когда вы создаете подкласс Form, лучше использовать только именованные аргументы для любых дополнительных аргументов, требуемых вашим классом пользовательской формы. В python 3 просто поместите ubc между *args и **kwargs в сигнатуре метода __init__.

class ChangeMemberForm(forms.Form):
    def __init__(self, *args, ubc, **kwargs):
        ...

(Если вы используете python 3.4 или более раннюю версию, вы должны включить значение по умолчанию для ubc, как упомянуто Виллемом в комментарии)

Если вам требуется поддержка Python 2, этот синтаксис недопустим, и вместо этого вы должны сделать что-то подобное.

class ChangeMemberForm(forms.Form):
    def __init__(self, *args, **kwargs):
        ubc = kwargs.pop('ubc')
        ...
0 голосов
/ 27 июня 2018

Порядок, в котором вы определили параметры:

def __init__(self<b>, ubc, *args</b>, **kwargs):

тогда как вы звоните на __init__ с:

<s>form = ChangeMemberForm(request.POST<b>, ubc=ubc.id</b>)</s>

Итак, вы назвали его безымянным первым параметром, тогда как первый параметр - ubc. Таким образом, в результате функция __init__ получила два значения для параметра ubc: request.POST и ubc.id, и, конечно, это не имеет смысла.

Так что вы должны заменить его на:

form = ChangeMemberForm(<b>ubc.id,</b> request.POST)

Таким образом, здесь это означает, что первый параметр (ubc.id) перенаправляется на параметр ubc, а второй (request.POST) является первым параметром *args, который является параметром super().__init__ звонок.

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