【问题标题】:django 1.8:XView is missing a QuerySet. Define XView.model, XView.queryset,django 1.8:XView 缺少 QuerySet。定义 XView.model、XView.queryset、
【发布时间】:2016-01-20 00:04:27
【问题描述】:

转到 url:/result_list.html 时出现错误。但是views.py中确实有查询集,那么还有什么其他原因呢?提前致谢。该功能根据用户提交的表单,过滤数据库,在result_list.html中显示表单条目和数据库结果。

追溯

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()

get_queryset 中的文件“C:\Python27\lib\site-packages\django-1.8.3-py2.7.egg\django\views\generic\list.py” 44. 'cls': self.class.name
异常类型:/result_list/ 处配置不当 异常值:ResultView 缺少 QuerySet。定义 ResultView.model、ResultView.queryset,或者覆盖 ResultView.get_queryset()。

下面是sn-ps:

网址

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 的建议

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()  

【问题讨论】:

  • 嗨@pythad,因为有2个html和2个视图,每个都报告不同的错误,这就是我在这里发布2个问题的原因。非常感谢您的建议,您可以看看我升级后的views.py吗?更改后返回相同的错误。谢谢。

标签: python django database


【解决方案1】:

您的代码存在多个问题:

  1. 您的 if self.request.method == 'POST': 方法中有一个 if self.request.method == 'POST': 块。如果计算结果为False,那么您将退回到父get_queryset 方法,这是触发错误的原因(因为父方法需要提供模型或查询集,如错误中所示)。因此,如果您尝试向 result_list/ 发出简单的 GET 请求,它将失败,因为 ListView 没有查询集。

  2. 您不应该从 get_queryset 方法内部呈现模板。该方法应该返回一个查询集,仅此而已。这将失败。

  3. 您的ResultView 确实不应该首先处理已发布的表单数据。您应该在您的FormView 中处理该问题,然后使用FormViews success_url 参数将用户重定向到适当的结果视图,如documentation on form processing 中所述。

【讨论】:

  • 嗨@solarissmoke,非常感谢您的建议。我根据您的建议更改了 views.py,但仍有 1 个问题我不明白。你能看看我的“根据你的建议更新的views.py”吗?提前致谢。
  • 您需要将相关参数传递给结果视图,然后在该视图(而不是表单视图)中执行查询集逻辑。
  • 嗨@solarissmoke,谢谢。我上传了“Verson 2.0 views.py”,但出现“未定义全局名称'公司'”的错误,所以我怀疑来自InputFormView的表单条目数据没有成功传递到ResultView。我在sn-p里做了笔记,你能看一下吗?非常感谢。
猜你喜欢
  • 2016-06-27
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2018-03-15
  • 2013-03-02
  • 2011-02-20
相关资源
最近更新 更多