django 1.8:XView缺少一个QuerySet。定义XView.model,XView.queryset, [英] django 1.8:XView is missing a QuerySet. Define XView.model, XView.queryset,
问题描述
当您访问url:/result_list.html时,我收到错误。但是,在views.py中确实有查询,所以可能是其他原因?提前致谢。该功能基于用户提交的表单,然后过滤数据库,并在result_list.html中显示表单条目和数据库结果。
I am getting error when go to the url: /result_list.html. But there is indeed queryset in the views.py, so what could be other reasons? Thanks in advance. The function is based on the form submitted by user, then filter the database and show the form entry and database result in the result_list.html.
追溯
Traceback
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\list.py" in get
159. self.object_list = self.get_queryset()
File "C:\Users\user\Desktop\SCOR\result\views.py" in get_queryset
70. return super(ResultView,self).get_queryset()
文件C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\list.pyin get_queryset
类。名称
异常类型:/ result_list /
异常配置异常值:ResultView缺失一个QuerySet。定义ResultView.model,ResultView.queryset或覆盖ResultView.get_queryset()。
File "C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\list.py" in get_queryset
44. 'cls': self.class.name
Exception Type: ImproperlyConfigured at /result_list/
Exception Value: ResultView is missing a QuerySet. Define ResultView.model, ResultView.queryset, or override ResultView.get_queryset().
下面是代码段:
url
url
from result.views import ResultView,InputFormView
from django.views.generic import TemplateView,FormView,ListView
urlpatterns = patterns('',
url(r'^result_list/$',ResultView.as_view(),name='result'),
url(r'^input/$',InputFormView.as_view(),name='input'),
)
views.py
from result.forms import InputForm
from result.models import Result,Input
from django.views.generic.list import ListView
from django.views.generic import FormView
....
@csrf_exempt
class InputFormView(FormView):
template_name = 'inputform.html'
form = InputForm
def get_success_url(self): /*redirect to result page with submitted form information*/
return ''.join(
[
reverse('dupont'),
'?company=',self.request.POST.get('company'),
'?region=',self.request.POST.get('region')
]
)
class ResultView(ListView):
context_object_name = 'result_list'
template_name = 'result_list.html'
def get_context_data(self, **kwargs):
context = super(ResultView, self).get_context_data(**kwargs)
return context
def get_queryset(self):
if self.request.method == 'POST':
form = InputForm(self.request.POST)
if form.is_valid():
company = form.cleaned_data['company']
region = form.cleaned_data['region']
/---Based on form entry, do the filter on the database-----/
queryset=Result.objects.filter(region=region,company=company)
sales=Result.objects.filter(queryset).aggregate(Sum('sales'))
employee=Result.objects.filter(queryset).aggregate(Sum('employee'))
departments=Result.objects.filter(queryset).aggregate(Sum('departments'))
form.save()
return render(request,'result_list.html',{'company':company},{'region':region},{'employee':employee},{'sales':sales},{'departments':departments})
else:
print form.errors
else:
form=InputForm()
return super(ResultView,self).get_queryset()
result_list.html
<div class="basicinfo"> <!--Entry Form information submitted by user-->
<table border="1" cellpadding="1">
<tr>
<td align="left">Company</td>
<td>{{company}}</td>
</tr>
<tr>
<td align="left">Region</td>
<td>{{region}}</td>
</tr>
</table>
<!--Showing the filtered result in database-->
<td><table border="0" cellspacing="10" cellpadding="10">
<tr><b>Sales</b></tr>
<td bgcolor="#F0F0F0"> {{sales}}</td>
</tr>
<tr><b>Employee</b></tr>
<tr>
<td bgcolor="#F0F0F0"> {{employee}}</td>
</tr>
<tr><b>Departments</b></tr>
<td bgcolor="#F0F0F0"> {{departments}}</td>
</td></table>
版本2.0 views.py根据solarissmoke'和pythad的建议 p>
Version 2.0 views.py as per solarissmoke' and pythad's suggestion
class InputFormView(FormMixin,DetailView):
template_name = 'inputform.html'
form = InputForm
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form=self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
print form.errors
def form_valid(self, form):
company = form.cleaned_data['company']
region = form.cleaned_data['region']
return super(ResultView,self).form_valid(form) 《Q1:---If here to return to ResultView or InputFormView?--->
def get_success_url(self): #Redirect to result_list.html
return reverse('result', kwargs={'pk': self.object.pk})
class ResultView(MultipleObjectMixin,DetailView):
context_object_name = 'result_list'
template_name = 'result_list.html'
<---Q2: How can I get the form data entry from InputFormView?-->
def get(self, request, *args, **kwargs):
view = InputFormView.as_view()
self.object = self.get_object(queryset=Result.objects.filter(company=company,region=region))
return super(Result, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(ResultView, self).get_context_data(**kwargs)
context['InputFormView']= self.object
return context
def get_queryset(self):
<--Error!-- this sentence is where reports error as "global name company,region not defined"-->
queryset=Result.objects.filter(company=company,region=region)
sales=Result.objects.queryset.aggregate(Sum('sales'))
employee=Result.objects.queryset.aggregate(Sum('employee'))
departments=Result.objects.queryset.aggregate(Sum('departments'))
return self.object.all()
推荐答案
您的代码有多个问题:
There are multiple issues with your code:
-
如果self.request.method =='POST',您有一个
:
块在您的get_queryset
方法。如果它评估为False
,那么您将返回到父get_queryset
方法,这是触发错误的原因(因为父方法需要给出模型或查询集,如错误中所示)。所以如果你尝试一个简单的GET请求到result_list /
,它将失败,因为ListView
没有一个查询集。
You have an
if self.request.method == 'POST':
block in yourget_queryset
method. If that evaluates toFalse
then you fall back to the parentget_queryset
method, which is what triggers the error (because the parent method needs to be given either a model or a queryset, as indicated in the error). So if you try a simple GET request toresult_list/
it will fail because theListView
doesn't have a queryset.
您不应从 get_queryset
方法内部渲染模板。该方法应该返回一个查询,没有别的。这将失败。
You shouldn't be rendering templates from inside the get_queryset
method. That method should return a queryset and nothing else. This will fail.
您的 ResultView
真的不应该在第一个地点。您应该在您的 FormView
中处理,然后使用 FormView
s success_url
参数,如表单处理文档。
Your ResultView
really shouldn't be handling the POSTed form data in the first place. You should be handling that in your FormView
and then redirecting the user to the appropriate result view by using the FormView
s success_url
parameter as explained in the documentation on form processing.
这篇关于django 1.8:XView缺少一个QuerySet。定义XView.model,XView.queryset,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!