我有 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。我已经检查了代码以查找可能导致它的错误。
构造函数应该是
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)