2015-10-24 3 views
7

Я получил эту ошибку при перенаправлении на страницу результатов. Это потому, что на перенаправленной странице функция «POST.get» не может получить то, что пользователь ввел в форму перед перенаправлением?Объект django-'NoneType 'не может быть вызван

views.py

class InputFormView(FormView): 
    template_name = 'inputform.html' 
    form_class = InputForm 

    def get_success_url(self): 
     return ''.join(
     [ 
      reverse('result'), 
      '?company=',self.request.POST.get('company'), 
      '&region=',self.request.POST.get('region') <is there anything wrong here---?  
     ] 
     ) 


class ReulstView(FormView): 
    context_object_name = 'result_list' 
    template_name = 'result_list.html' 
    model = Result 

    if form.is_valid(): 
     company = form.cleaned_data['company'] 
     region = form.cleaned_data['region'] 

     self.queryset=Result.objects.filter(region=region) 

     return render(request, 'result_list.html', {'form': form}) 

    def get_context_data(self, **kwargs): 
     context = super(ReulstView, self).get_context_data(**kwargs) 
     context["sales"] = self.get_queryset().aggregate(Sum('sales')) 

     context["company"] = self.request.POST.get("company") 
     context["region"] = self.request.POST.get("region") 

     return context 

    def get_queryset(self): 
     return Result.objects.all() 

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

Inputform

class InputForm(forms.ModelForm): 
    company=forms.CharField(widget=forms.TextInput, label="Company",error_messages={'required': 'Please enter the company name'},required=True) 

    #region This form can display correctly with drop down list 
    iquery = Dupont.objects.values_list('region', flat=True).distinct() 
    iquery_choices = [('', 'None')] + [(region,region) for region in iquery] 
    region = forms.ChoiceField(choices=iquery_choices) 

По той же функции, Я попробовал другой код, хотя без ошибок, но не могу отобразить данные формы, он отображается как ничто. Надеюсь, что вы можете ответить на мой вопрос в следующей ссылке:

django- why after redirecting, the form display "None"

+1

Могли бы вы предоставить более отслеживающий или точку, которая терпит неудачу строка вашего кода? – Paul

+0

Привет @Paul, он не указывает, какая строка неверна. Я поставил весь трассировку –

+0

Какой текстовый редактор или IDE вы используете? – Paul

ответ

8

Я думаю, что это ваш вопрос: Вы используете FormView, но не определен класс формы для использования. Либо установить form_class Аттрибут на классе, или переопределить get_form_class метод:

class ReulstView(FormView): 
    context_object_name = 'result_list' 
    template_name = 'result_list.html' 
    model = Result 
    form_class = InputForm 

Кроме того, метод form_valid получит экземпляр формы, вам не нужно, чтобы создать его экземпляр вручную:

def form_valid(self, form, **kwargs): 
    form = InputForm(self.request.POST) # <- remove this line 
    if form.is_valid(): 
    ... 
+0

Привет @ Арш Сингх, вы думаете, что что-то не так с "return render_to_response ({" object_list ": queryset})" в my views.py, так как там сообщается об ошибке после изменения, как вы предлагаете? –

+0

@ Elena Я прав, что теперь вы получаете еще одну ошибку? – Paul

+0

@Elena Я считаю, что ваш второй вопрос может быть связан с ошибкой, которую вы сейчас получаете. Какую именно ошибку вы сейчас получаете? – Paul

2

Позволяет сделать другой поток. :) Единственный способ, которым вы можете получить ошибку «return outside function» - вы пытаетесь вернуть что-то не из функции. :) Это может произойти обычно из-за неправильной или неправильной отступов. Не могли бы вы предоставить код, в котором вы получите эту ошибку? Я считаю, что там что-то не так с отступом.

class ReulstView(FormView): 
    context_object_name = 'result_list' 
    template_name = 'result_list.html' 
    model = Result 

    if form.is_valid(): # <- it is not a function or method 
         # it is a class declaration 
     company = form.cleaned_data['company'] 
     region = form.cleaned_data['region'] 

     self.queryset=Result.objects.filter(region=region) 

     return render(request, 'result_list.html', {'form': form}) 
    def get_context_data(self, **kwargs): #<- and this is a method 
     #... all your following code 

Я не знаком с Django FormViews, но выглядит как правильный код может выглядеть так:

class ResultView(FormView): 
    context_object_name = 'result_list' 
    template_name = 'result_list.html' 
    model = Result 

    def form_valid(self, form): 
     company = form.cleaned_data['company'] 
     region = form.cleaned_data['region'] 
     self.queryset=Result.objects.filter(region=region)  
     return render(request, 'result_list.html', {'form': form}) 
+0

Я обновил views.py, я не совсем думаю, что это из-за проблемы с отступом. Ошибка возникает в строке «return render (request, 'result_list. html ', {' form ': form}) " –

+0

@Elena, если код из вашего вопроса прав, вы пытаетесь вернуться не из функции. Но вы правы - это не проблема идентификации. :) Я обновил свой ответ снова – Paul

+0

Раньше у меня был код, который вы предлагаете, но ответ @Arsh Singh abov e предлагает «удалить форму form_valid (self, form) для FormView, поэтому я удалил ее. –