2015-10-23 62 views
5

我有一個表格,輸入信息,根據信息來源後,過濾數據庫,並做了一些計算,最終顯示結果爲重定向URL。django-爲什麼重定向後,表單顯示「無」

我確實可以重定向到另一個url併成功顯示結果。但問題在於它無法顯示用戶提交的任何數據的形式,只是對每個字段沒有顯示任何內容,並且結果不基於查詢結果集。讓我們說,總和,它只是總結數據庫中的所有列,而不使用過濾的結果。

我懷疑查詢集未通過濾波的結果變形點焊get_context_data,因此get_context_data的查詢集不起作用。

真的非常感謝你,如果你解決我的疑問。

(我做了基於一個建議編輯版本,以2班相結合,希望有人能解決這個編輯的版本,感謝)

enter image description here

urls.py

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

views.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

<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> 
</div>  

<!--Showing the filtered result in database--> 
<td><table border="0" cellspacing="10" cellpadding="10"> 
<tr><b>Sales</b></tr> 
<td bgcolor="#F0F0F0"> {{ sales.sales__sum }}</td> 

</tr> 
<tr><b>Employee</b></tr> 
<tr> 
<td bgcolor="#F0F0F0"> {{ employee.employee__sum }}</td> 

</table> 

編輯 - 結合2類視圖

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 

**編輯 - 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? 
+2

**什麼**,確切地說,顯示無? –

+0

我相信這就是發生了什麼 - 你假設數據是在'POST'上下文中,但是當你重定向到另一個頁面時,它不再是'POST' - 因此你正在丟失上下文中的數據。解決這個問題的一種方法是將POST參數作爲kwargs發送到重定向視圖中。 – karthikr

+0

喜@丹尼爾·羅斯曼,在重定向頁面,「公司」和「區域」的值顯示‘無’ –

回答

3

您的代碼應該工作。你真的需要接受POST請求的FormView嗎?您可以改爲直接通過GET提交到您的結果視圖。在您的每一次意見 -

根據您目前的做法,實際上是處理表單的兩倍。

編輯:也是,他們的方式要生成的重定向URL是不是安全。你應該這樣,而不是:

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())]) 
+0

喜@solarissmoke,有一些錯誤有關「迴歸'。加入([反向('結果'),'?',urllib.urlencode(params)])「。我更新了帖子中的回溯,謝謝。 –

+0

我編輯了答案 - 嘗試'urllib.urlencode(params.items())'。 – solarissmoke

+0

嗨@solarissmoke,因爲我有2個網站分別爲表單和結果,所以我做了2個單獨的類視圖。根據你的建議,你的意思是我刪除類InputFormView,移動def get_success_url部分到ResultView(請求),對不對?如果我錯了,請糾正我,謝謝。 –

1

如果您POST請求,然後你重定向用戶,下一個請求會有空POST(因爲現在它是另一個請求)。所以,這不是一個令人驚訝的行爲。 如果要保存會話之間的這種數據,可以將其保存在用戶會話,例如。

設置一個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) 

獲取餅乾:

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 

可以通過添加以下代碼修改一些你的看法(這使重定向,我相信) )您也可以,因爲現在他們都硬編碼這個cookie將設置的移動名字,現在是非常好的做法。喜歡的東西settings.SAVED_FORM_NAME_COOIKE_TOKEN 2)您也可以從消毒和request.POST數據Request.Cookies時,因爲用戶可以將一些有惡意的數據(SQL注入等)。

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

和你get_context_data方法:

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 

這就是說,你的代碼可以用一些重構做,如果你改變你的get_queryset方法

+0

嗨@保羅的名字ü可以做出這樣的例子?我有點困惑... –

+0

謝謝〜我不確定我是否正確理解你,因此我更新了views.py,正如你所建議的那樣,它返回錯誤,如「名稱請求未定義」,請你幫忙看看或在tha上編輯直接? –

+0

@Elena能否請您查看您正在執行重定向的代碼? – Paul

相關問題