繁体   English   中英

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

[英]django 1.8 error: 'NoneType' object is not callable

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

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

现在的问题是“'NoneType'对象不可调用'。所以我怀疑这是因为views.py出了点问题。我们非常感谢您的帮助。在此先感谢您。

在此处输入图片说明

网址

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"?

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

在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>

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

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

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

如果我理解正确,那么当您发送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存在吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM