django 1.8错误:' NoneType'对象不可调用

时间:2015-10-21 03:32:14

标签: python django database

请看图中,有一个包含2个字段的表格。用户输入信息并提交表格后。该页面将重定向到另一个显示表单和过滤的数据库结果的html。

我的项目结构是1个模型,有2个类(inputform; result),2个html和1个views.py。

现在的问题是"' NoneType'对象不可调用'。所以我怀疑是因为views.py,有些不对劲。非常感谢您的帮助。提前谢谢。

enter image description here

网址

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

回溯:

    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 /input/
Exception Value: 'NoneType' object is not callable

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>
{% endfor %}
</div>     

<!--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.employee__sum}}</td>

</tr>
<tr><b>Departments</b></tr>
<td bgcolor="#F0F0F0"> {{departments.departments__sum}}</td>
</td></table>

input.html

<div class="field">
        {{ form.company.errors }}
        <label for="{{ form.company.id_for_label }}">Company:</label>
        {{ form.company }}
</div>

<div class="field" >
<label> Select the Region:
    {{ form.region }}
        {% for region in form.region.choices %}
        <option value="region" name= "region" id="id_region">{{region}} </option>
        {% endfor %}
</label>
</div>

根据建议升级views.py

from result.forms import InputForm
from django.views.generic import DetailView
from django.views.generic.edit import FormView,FormMixin
from django.contrib import messages
from django.template import RequestContext
from django.shortcuts import redirect
from django.db.models import Sum,Avg
from django.views.generic.detail import MultipleObjectMixin

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 get(self, request, *args, **kwargs):
        view = DupontView.as_view()
        return view(request, *args, **kwargs)

    def form_valid(self, form):
        company = form.cleaned_data['company']
        region = form.cleaned_data['region']

        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 super(ResultView,self).form_valid(form)

    def get_success_url(self):
        return reverse('dupont', kwargs={'pk': self.object.pk})

class ResultView(MultipleObjectMixin,DetailView):
    context_object_name = 'result_list'
    template_name = 'result_list.html'


    <----how can I get the submitted information and query result here from InputFormView? Is following correct?--->

    def get(self, request, *args, **kwargs):
        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):
        return self.object. ? .all()  <---what to put here? are they  "sales","departments","employee" from database filtered result together with the form data-"region" and "company"?

4 个答案:

答案 0 :(得分:2)

请看一下这些文件,也许它们会对您有所帮助。 https://github.com/EchoUA/Tweaks-and-Hacks/tree/master/miaomiao

答案 1 :(得分:1)

在views.py中

,上下文是一个字典!

return render(request,'result_list.html',{'company':company,'region':region, 'employee':employee, 'sales':sales, 'departments':departments})


<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 :(得分:1)

您正在为一个简单的表单编写太多代码。

创建一个简单的表单;这只是搜索您的第二个视图:

class SearchForm(forms.Form):
    company = forms.CharField()
    region = forms.CharField()

创建一个视图以显示表单:

def search_form(request):
    form = SearchForm(request.GET)
    if form.is_valid():
        company = form.cleaned_data['company']
        region = form.cleaned_data['region']
        url = '{}?company={}&region={}'.format(reverse('result-list'), company, region)
        return redirect(url)
    return render(request, 'form.html', {'form': form})

创建视图以显示结果:

def show_results(request):
    company = request.GET.get('company')
    region = request.GET.get('region')
    if company is None or region is None:
        return redirect('input')

    # Your normal logic here
    queryset=Result.objects.filter(company=company,region=region)
    sales=Result.objects.aggregate(Sum('sales'))
    employee=Result.objects.aggregate(Sum('employee'))
    departments=Result.objects.aggregate(Sum('departments'))

    return render(request, 'results.html', {'sales': sales,
                                            'employee': employee,
                                            'departments': departments,
                                            'queryset': queryset})            

答案 3 :(得分:1)

如果我理解正确,当您向

发送GET请求时
127.0.0.1:8000/input/

然后你得到错误。向该URL发送发布请求时是否会收到相同的错误?尝试将input.html更改为:

<div class="field">
    <!-- Check if the errors exist first before calling them. 
         If youre sending a GET request, then form errors will 
         probably not exist. -->
        {% if form.company.errors %}
            {{ form.company.errors }}
            <label for="{{ form.company.id_for_label }}">Company:</label>
        {% endif %}
        {{ form.company }}
</div>

<div class="field" >
<label> Select the Region:
    {{ form.region }}
        <!-- over here, are you sure form.region.choices exists? Can you
             post your model / model form so that we can verify that
             form.region.choices exists? -->
        {% for region in form.region.choices %}
        <option value="region" name= "region" id="id_region">{{region}} </option>
        {% endfor %}
</label>
</div>

如果您在使用此代码后仍然出现错误,请告诉我们。在上面的代码中,我留下了一条评论,提到验证form.region.choices是否存在。您可以上传模型和模型表单,以便我们可以验证form.region.choices是否存在?