如何修复 Django 在 ModelChoiceField 的查询集过滤上返回“self”未定义的 NameError?

问题描述 投票:0回答:1

我有 2 个模型,Type 和 Measure。每个 Measure 对象都有一个 typeid ForeignKey 字段,该字段引用 Type 对象的 id 字段。每种类型都在其自己的页面上查看,其中 id 通过 URL 传递。 网址.py

urlpatterns = [
    path('type/<int:id>', views.type, name='type'),
]

在我将 ModelChoiceField 添加到表单之前,视图一直在使用它。

views.py

def type(request, id):
    mytypes = Type.objects.all().values()
    mytype = Type.objects.get(id=id)
    mymeasures = Measure.objects.filter(typeid=id)
    template = loader.get_template('type.html')
    if request.method == 'GET':
        form = ConvForm(request.GET)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            if request.from_type != None:
                redir = f"/type/{id}"        # create a form instance and populate it with data from the request:
            return HttpResponseRedirect(redir)

    # if a GET (or any other method) we'll create a blank form
    else:
        form = ConvForm(id)
    context = {
        'form' : form,
        'mytype': mytype,
        'mytypes' : mytypes,
        'mymeasures' : mymeasures
    }
    return HttpResponse(template.render(context, request))

一旦导入表单,它就会遇到以下代码的问题。

表格.py

class ConvForm(forms.Form):
    from_value = forms.DecimalField(label='From Value', max_digits=256, decimal_places=255)
    from_measure = forms.ModelChoiceField(queryset=Measure.objects.none())

    class __init__(self, *args, **kwargs):
        id = kwargs.pop('id')
        super(ConvForm, self).__init__(*args, **kwargs)
        self.fields['from_measure'].queryset = Measure.objects.filter(typeid=id)

这是 class init 行产生以下错误的地方。

NameError: name 'self' is not defined

我搜索了几个讨论如何查询集过滤 ModelChoiceField 的地方,它们都使用非常相似的类 init。我已经检查了代码以查找可能导致它的错误。

python django django-forms django-queryset django-model-field
1个回答
0
投票

构造函数应该是

def
不是
class

你的代码应该是这样的

class ConvForm(forms.Form):
    from_value = forms.DecimalField(label='From Value', max_digits=256, decimal_places=255)
    from_measure = forms.ModelChoiceField(queryset=Measure.objects.none())

    def __init__(self, *args, **kwargs):
        id = kwargs.pop('id')
        super(ConvForm, self).__init__(*args, **kwargs)
        self.fields['from_measure'].queryset = Measure.objects.filter(typeid=id)
   
© www.soinside.com 2019 - 2024. All rights reserved.