2015-10-21 39 views
2

请看图中,有一个2字段的表单。用户输入信息并提交表单后。该页面将重定向到另一个html,显示表单和过滤的数据库结果。django 1.8错误:'NoneType'对象不可调用

我的项目的结构是1模型与2类(inputform;结果),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"? 
+0

请问您可以包括完整的追溯? – ojii

+0

你可以发布result_list.html,看起来有点腥! –

+0

它不存在,你给错了链接!只是在这里发布! –

回答

2

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

+0

嗨@EchoUA团队,真的非常感谢你,这真的很有用~~~,但是这个代码仍然返回“XX缺少查询集”的错误,如链接所示:http://stackoverflow.com/questions/33251737/django-1-8-xview-is-missing-a-queryset-define-xview- model-xview-queryset,solarissmoke暗示我们不应该在get_query方法中渲染模板,我仍然在考虑如何让代码运行 –

+0

Hi @EchoUA Team,我也有疑问,为什么不把表单放在里面。清空数据...这些表单处理代码在“类InputFormView”,而不是“类ResultView”? –

+0

你可以请完整的追溯? – EchoUA

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> 
+0

嗨@Manjunath Satyamurthy,非常感谢,升级为你建议,“ResultView缺少一个QuerySet是错误的。定义ResultView.model,ResultView.queryset或重写ResultView.get_queryset()。“在我的视图中是否有其他错误? –

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

Hi @ Burhan Khalid,我喜欢你的简单代码,但是现在在提交表单后,它可以重定向到结果页面,但它没有显示任何形式(提交的数据)和表格(过滤结果)。我的result_list.html有什么不对吗? –

1

如果我没有理解正确地,当您发送GET请求到

127.0.0.1:8000/input/ 

然后你得到错误。当您向该网址发送发布请求时,是否会收到同样的错误?尝试将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是否存在?

+0

hi @ user2719875,非常感谢您,您的代码有效,并且模型对您的笔记非常感兴趣。我检查了上述所有答案,但在重定向到未能显示表单数据的结果页面时,存在所有问题。所以我想我会学习Ajax来解决问题。 –

相关问题