问题描述
重定向到结果页面时出现此错误。 那是不是因为在重定向页面中,“POST.get”函数在重定向前无法获取用户在表单中输入的内容?
视图.py
class InputFormView(FormView):
template_name = 'inputform.html'
form_class = InputForm
def get_success_url(self):
return ''.join(
[
reverse('result'),
'?company=',self.request.POST.get('company'),
'®ion=',self.request.POST.get('region') <is there anything wrong here---?
]
)
class ReulstView(FormView):
context_object_name = 'result_list'
template_name = 'result_list.html'
model = Result
if form.is_valid():
company = form.cleaned_data['company']
region = form.cleaned_data['region']
self.queryset=Result.objects.filter(region=region)
return render(request, 'result_list.html', {'form': form})
def get_context_data(self, **kwargs):
context = super(ReulstView, self).get_context_data(**kwargs)
context["sales"] = self.get_queryset().aggregate(Sum('sales'))
context["company"] = self.request.POST.get("company")
context["region"] = self.request.POST.get("region")
return context
def get_queryset(self):
return Result.objects.all()
追溯:
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\core\handlers\base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\edit.py" in get
205. form = self.get_form()
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\edit.py" in get_form
74. return form_class(**self.get_form_kwargs())
Exception Type: TypeError at /result_list/
Exception Value: 'NoneType' object is not callable
输入表单
class InputForm(forms.ModelForm):
company=forms.CharField(widget=forms.TextInput, label="Company",error_messages={'required': 'Please enter the company name'},required=True)
#region This form can display correctly with drop down list
iquery = Dupont.objects.values_list('region', flat=True).distinct()
iquery_choices = [('', 'None')] + [(region,region) for region in iquery]
region = forms.ChoiceField(choices=iquery_choices)
对于相同的功能,我尝试了另一个代码,即使没有错误但无法显示表单数据,它也显示为无。 希望您能在以下链接中回答我的问题:
1楼
我认为这是您的问题:您正在使用FormView
但尚未定义要使用的表单类。
要么在类上设置一个form_class
属性,要么覆盖get_form_class
方法:
class ReulstView(FormView):
context_object_name = 'result_list'
template_name = 'result_list.html'
model = Result
form_class = InputForm
此外, form_valid
方法将接收表单实例,您不需要手动实例化它:
def form_valid(self, form, **kwargs):
form = InputForm(self.request.POST) # <- remove this line
if form.is_valid():
...
2楼
让我们再做一个线程。 :) 获得“返回函数外”错误的唯一方法 - 您试图返回不是从函数中返回的内容。 :) 这通常是由于错误类型或错误的缩进而发生的。 您能否提供出现此错误的代码? 我相信那里的缩进有问题。
class ReulstView(FormView):
context_object_name = 'result_list'
template_name = 'result_list.html'
model = Result
if form.is_valid(): # <- it is not a function or method
# it is a class declaration
company = form.cleaned_data['company']
region = form.cleaned_data['region']
self.queryset=Result.objects.filter(region=region)
return render(request, 'result_list.html', {'form': form})
def get_context_data(self, **kwargs): #<- and this is a method
#... all your following code
我不熟悉 Django FormViews,但看起来正确的代码可能是这样的:
class ResultView(FormView):
context_object_name = 'result_list'
template_name = 'result_list.html'
model = Result
def form_valid(self, form):
company = form.cleaned_data['company']
region = form.cleaned_data['region']
self.queryset=Result.objects.filter(region=region)
return render(request, 'result_list.html', {'form': form})
3楼
问题很可能出在您的 forms.py 文件上。
当您在 forms.py 文件中导入和使用模型时,您正在使用括号来定义您不应该使用的模型。
例如,如果您的模型是让我们假设 Post,则应将其定义为Post
而不是Post()