2012-02-13 56 views
3

使用一個通用的FormView我想反映一些關於已提交給用戶的POST數據,但我不知道如何最好地做到這一點。確認通用FormView的崗位上取得成功回用戶用POST數據

class MyView(generic.FormView): 
    form_class = MyForm 
    def get_success_url(self): 
     return reverse('success') 

reverse('success')重定向到一個簡單的

class SuccessView(generic.TemplateView): 
    template_name = 'success.html' 

有沒有辦法,我可以通過get_success_url呼叫SuccessView訪問params對象的方式,或者是有一個更好的(和簡單)的方式來做到這一點? TIA丹

UPDATE(我的解決方案,但感謝的想法)

我居然發現,這是最簡單的方法(對我來說)來解決這個問題:

class SuccessMixin(object): 
    def post(self, request, *args, **kwargs): 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 

     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form, **kwargs) 

    def form_valid(self, form): 
     # this is my post processing step which returns the 
     # feedback data that I want to pass to the user 
     form_data = form.get_some_data_from_form() 
     return render_to_response('submitted.html', 
      {'form_data': form_data,}, 
      context_instance=RequestContext(self.request)) 

每個視圖繼承此mixin,如果表單有效,那麼我會從中提取反饋數據並將其作爲響應呈現 - 完全繞過get_success_url重定向。我已經刪除了get_success_urlSuccessView

回答

5

包括數據爲您的成功網址GET參數。

def get_success_url(self): 
    url = reverse('success') 
    # maybe use urlencode for more complicated parameters 
    return "%s?foo=%s" % (url, self.request.POST['bar']) 

然後在您的模板中,訪問GET數據中的參數。

foo: {{ request.GET.foo }} 
1

一種方式來完成你正在尋找這樣做是通過使用會話的內容。將所需的任何值存儲在用戶的會話對象中,並從SuccessView中訪問它們。查看Django session documentation瞭解更多詳情。

+0

h出入該消息毫米 - 所有表格都是唯一的,所以使用Sessions會抹掉DRY(將任何表單中的每個字段加載到會話中)。謝謝你的想法。 – danodonovan 2012-02-13 22:42:07

+0

爲什麼不製作所有表單繼承的父表單。重寫__init__或者is_valid方法(很難說沒有任何關於如何在視圖中使用表單的例子,視圖如何不同,表單如何不同等),將請求的相關部分加載到用戶會話從那裏?我不明白在哪裏使用這種方法會複製任何代碼。 – fourk 2012-02-13 22:52:45

2

我試圖弄清楚這一點也和一個簡單的解決方案是使用:

from django.contrib import messages 

在get_success_url(個體經營)你可以寫

def get_success_url(self) 
    messages.add_message(self.request, messages.SUCCESS, 'Contact Successfully Updated!') 
    return reverse('contacts:contact_detail', args=(self.get_object().id,)) 

且模板中你可以通過

{% for message in messages %} 
    {{ message }} 
{% endfor %}