django 1.8:XView缺少一个QuerySet。定义XView.model,XView.queryset, [英] django 1.8:XView is missing a QuerySet. Define XView.model, XView.queryset,

查看:1603
本文介绍了django 1.8:XView缺少一个QuerySet。定义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:


  1. 如果self.request.method =='POST',您有一个块在您的 get_queryset 方法。如果它评估为 False ,那么您将返回到父 get_queryset 方法,这是触发错误的原因(因为父方法需要给出模型或查询集,如错误中所示)。所以如果你尝试一个简单的GET请求到 result_list / ,它将失败,因为 ListView 没有一个查询集。

  1. You have an if self.request.method == 'POST': block in your get_queryset method. If that evaluates to False then you fall back to the parent get_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 to result_list/ it will fail because the ListView 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 FormViews success_url parameter as explained in the documentation on form processing.

这篇关于django 1.8:XView缺少一个QuerySet。定义XView.model,XView.queryset,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆