首页 > 解决方案 > __init__() 为参数“crescator”获得了多个值

问题描述

我有一个 ModelForm,在 ModelChoiceField 中我需要按 request.user 过滤对象。提交数据时,出现错误“ init () got multiple values for argument 'crescator'”。我该如何修复它?

#My Form
class AdaugaPereche(forms.ModelForm):
    boxa = forms.IntegerField(label="Boxa", min_value=1)
    sezon = forms.CharField(label="Sezon reproducere", initial=datetime.now().year)
    mascul = forms.ModelChoiceField(queryset=None, label="Mascul", empty_label="Alege mascul")
    femela = forms.ModelChoiceField(queryset=None, label="Femela", empty_label="Alege femela")

    serie_pui_1 = forms.TextInput()
    serie_pui_2 = forms.TextInput()
    culoare_pui_1 = forms.ModelChoiceField(queryset=None, label="Culoare pui 1", empty_label="Alege culoarea",
                                       required=False)
    culoare_pui_2 = forms.ModelChoiceField(queryset=None, label="Culoare pui 2", empty_label="Alege culoarea",
                                       required=False)
    data_imperechere = forms.DateInput()
    primul_ou = forms.DateInput()
    data_ecloziune = forms.DateInput()
    data_inelare = forms.DateInput()
    comentarii = forms.TextInput()

    # Functie pentru filtrarea rezultatelor dupa crescator
    def __init__(self, crescator, *args, **kwargs):
        super(AdaugaPereche, self).__init__(*args, **kwargs)
        self.fields['mascul'].queryset = Porumbei.objects.filter(crescator=crescator, sex="Mascul",                                                                 
                    perechi_masculi__isnull=True)
        self.fields['femela'].queryset = Porumbei.objects.filter(crescator=crescator, sex="Femelă",
                    perechi_femele__isnull=True)
        self.fields['culoare_pui_1'].queryset = CuloriPorumbei.objects.filter(crescator=crescator)
        self.fields['culoare_pui_2'].queryset = CuloriPorumbei.objects.filter(crescator=crescator)

    class Meta:
        model = Perechi
        fields = "__all__"


#My view
def perechenoua(request):
    if request.method == "POST":
        form = AdaugaPereche(request.POST, crescator=request.user)
        if form.is_valid():
            obj = form.save(commit=False)
            obj.crescator = request.user
            obj.save()
            return HttpResponseRedirect("/perechi/")
        else:
            form = AdaugaPereche(crescator=request.user)
    context = {
        'form': form
}
    template = loader.get_template("adauga-pereche.html")
    return HttpResponse(template.render(context, request))

问题可能是 obj = form.save(commit=False) obj.crescator = request.user obj.save() 吗?

标签: pythondjango

解决方案


表单签名的__init__函数在这里作为第一个参数crescator,但是你request.POST作为那个参数传递,此外你也把它作为一个命名参数传递。通过重新排列参数,这应该可以工作:

class AdaugaPereche(forms.ModelForm):

    # ...

    def __init__(self, *args, crescator=None, **kwargs):
        super(AdaugaPereche, self).__init__(*args, **kwargs)
        self.fields['mascul'].queryset = Porumbei.objects.filter(crescator=crescator, sex="Mascul",                                                                 
                    perechi_masculi__isnull=True)
        self.fields['femela'].queryset = Porumbei.objects.filter(crescator=crescator, sex="Femelă",
                    perechi_femele__isnull=True)
        self.fields['culoare_pui_1'].queryset = CuloriPorumbei.objects.filter(crescator=crescator)
        self.fields['culoare_pui_2'].queryset = CuloriPorumbei.objects.filter(crescator=crescator)

    # ...

推荐阅读