django- por qué después de redirigir, el formulario muestra “Ninguno”

Tengo un formulario que, después de ingresar la información, se basa en la información que filtra la base de datos, realiza algunos cálculos y finalmente muestra el resultado a una URL redirigida.

De hecho, puedo redirigir a otra URL y muestra el resultado con éxito. Pero el problema está en la forma en que no puede mostrar ningún dato enviado por el usuario, simplemente no muestra nada para cada campo y el resultado no se basa en consultas completadas. Digamos la sum, simplemente resume todas las columnas en la base de datos, sin utilizar el resultado filtrado.

Sospecho que el conjunto de consultas no pasa el resultado filtrado a def get_context_data, por lo tanto el conjunto de consultas en get_context_data no funciona

Realmente muchas gracias si solucionas mi duda.

(Hice una versión EDIT basada en la sugerencia de combinar 2 clases, espero que alguien pueda corregir esta versión EDIT, gracias)

introduzca la descripción de la imagen aquí

urls.py

url(r'^result_list/$',ResultView.as_view(),name='result'), url(r'^input/$',InputFormView.as_view(),name='input'), 

vistas.py

 class InputFormView(request): #class InputFormView(FormView): template_name = 'inputform.html' form_class = InputForm response = HttpResponse( 'result' ) request_form_data = request.POST #you need to sanitize/clear this data response.set_cookie('form_data', request_form_data) #redirect to result page with submitted form information def get_success_url(self): return ''.join( [ reverse('result'), '?company=',self.request.POST.get('company'), <--do I need to change "POST" into "USER"? '&region=',self.request.POST.get('region') ] ) #class ResultView(ListView): class ResultView(request): context_object_name = 'result_list' template_name = 'result_list.html' model = Result def get_context_data(self, **kwargs): context = super(ResultView, 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): if self.request.method == 'POST': form = InputForm(self.request.POST) if form.is_valid(): company = form.cleaned_data['company'] region = form.cleaned_data['region'] queryset=Result.objects.filter(region=region) return queryset return Result.objects.all() if request.COOKIES.has_key('form_data'): value = request.COOKIES['form_data'] #this data also should be sanitized 

html

 
Company {{ company }}
Region {{ region }}
SalesEmployee
{{ sales.sales__sum }}
{{ employee.employee__sum }}

EDITAR- combinando las 2 vistas de clase.

 import urllib #@csrf_exempt class ResultView(ListView): context_object_name = 'result_list' template_name = 'result_list.html' model = Result def get_queryset(self): form = InputForm(self.request.GET) if form.is_valid(): company = form.cleaned_data['company'] region = form.cleaned_data['region'] queryset=Result.objects.filter(region=region) return queryset return Result.objects.all() def get_success_url(self): params = { 'company': self.request.POST.get('company'), 'region': self.request.POST.get('region') } return ''.join([reverse('result'), '?', urllib.urlencode(params.items())]) def get_context_data(self,**kwargs): context = super(ResultView, self).get_context_data(**kwargs) context["sales"] = self.get_queryset().aggregate(Sum('sales')) context["company"] = self.request.GET.get("company") context["region"] = self.request.GET.get("region") return context 

** EDIT- urls.py **

 url(r'^result_list/$',ResultView.as_view(),name='result'),----for the result page url(r'^input/$',result.views.get_success_url,name='input') -----for the form, I am not sure if this line correct or not? 

Su código debería funcionar si cambia su método get_queryset a:

 def get_queryset(self): # You are sending GET params here, not POST form = InputForm(self.request.GET) if form.is_valid(): company = form.cleaned_data['company'] region = form.cleaned_data['region'] queryset=Result.objects.filter(region=region) return queryset return Result.objects.all() 

y su método get_context_data para:

 def get_context_data(self, **kwargs): context = super(ResultView, self).get_context_data(**kwargs) context["sales"] = self.get_queryset().aggregate(Sum('sales')) # Your variables are in GET, not POST context["company"] = self.request.GET.get("company") context["region"] = self.request.GET.get("region") return context 

Dicho esto, su código podría hacer con un poco de refactorización. ¿Realmente necesita el FormView que acepta una solicitud POST? En su lugar, podría tener un formulario que se envíe directamente a través de GET a su vista de resultados.

Con su enfoque actual, en realidad está procesando el formulario dos veces, una vez en cada una de sus vistas.

Edición: también, la forma en que está generando su URL de redireccionamiento no es segura. Deberías hacer algo como esto en su lugar:

 import urllib def get_success_url(self): params = { 'company': self.request.POST.get('company'), 'region': self.request.POST.get('region') } return ''.join([reverse('result'), '?', urllib.urlencode(params.items())]) 

Si realiza una solicitud POST, y después de eso, está redirigiendo al usuario, la siguiente solicitud tendrá POST vacía (ya que ahora es otra solicitud). Por lo tanto, no es un comportamiento sorprendente. Si desea guardar estos datos entre sesiones, puede guardarlos en la sesión del usuario, por ejemplo.

Puedes modificar algunas de tus vistas (lo cual creo que redirigir) agregando este código:

Configurando una cookie:

 def your_view_which_makes_redirect(request): #.. here is your code response = HttpResponse( 'blah' ) request_form_data = request.POST #you need to sanitize/clear this data response.set_cookie('form_data', request_form_data) 

Obteniendo cookies:

 def your_view_which_renders_page_after_rediret(request): if request.COOKIES.has_key('form_data'): value = request.COOKIES['form_data'] #this data also should be sanitized 

1) También puede mover el nombre de esta cookie a la configuración porque ahora están codificados y ahora es una buena práctica. Algo parecido a la configuración.SAVED_FORM_NAME_COOIKE_TOKEN 2) También debe limpiar los datos de request.POST y request.COOKIES, porque el usuario puede colocar algunos datos maliciosos (inyección de SQL, etc.).