2016-11-30 117 views
0

這裏是新的Django用戶。 我想在GET請求時限制對Django的success_url()的訪問。我意識到我不是第一個問這個問題的人,但是,我特別試圖通過Django的泛型基於類的視圖來實現這一點。通用視圖看起來更乾淨,更快,更習慣。我想盡可能地使用它們,除非它們完全不適合這項工作。限制對Django的訪問success_url()

基本上,我正在爲非用戶創建一個簡單的聯繫表單,他們只想在不創建帳戶的情況下向我發送消息。我創建了一個聯繫人應用來處理這些類型的聯繫人。我創建了一個ModelForm,我用一個帶有Django FormView的contact.html進行渲染。一個人提交表單後,他們會收到一個很酷的表示謝意的信息,並使用具有自己url的thanks.html進行呈現。

但我只希望他們看到感謝信息,如果他們張貼聯繫表格。目前,您可以在我的網站上輸入'/ contact/thanks /',並且我的thanks.html將會呈現,無論您是否提交表單。 Django的success_url顯然默認爲GET請求。

這是我的觀點:

class MyContact(FormView): 
    template_name = 'contact.html' 
    form_class = ContactForm 
    success_url = 'thanks' 

這裏是我的形式:

ContactForm(forms.ModelForm): 
    class Meta: 
     model = Contact 
     fields = ['email_address', 'message_body'] 

下面是contact.html HTML表單:

<form action="" method="POST">{% csrf_token %} 
    {{ form|crispy }} 
    <button type="submit" class="send btn btn-secondary">Send Message</button> 
    </form> 

我首先想到的是裝飾我聯繫使用require_POST()裝飾器的應用程序url是這樣的:

urlpatterns = [ 
url(r'^thanks/$', require_POST(views.ThanksPageView.as_view()), name='thanks'), 

]

這不起作用,因爲Django的success_url()默認爲GET請求。

什麼是最習慣的方法來解決這個問題?由於Django是一個「包含電池」的框架,我不想使用'duck-tape',這意味着我不想在我的觀點或URL中實現任何特定的邏輯。

對不起,如果我錯過了任何文檔或問題存檔。

回答

2

由於您要求採用慣用方法,因此我會考慮消息框架,特別是SuccessMessageMixin。這將允許您將成功消息添加到例如聯繫表格本身和/thanks/頁面的url模式將不是必需的。

+0

謝謝你mhkuu! SuccessMessageMixin非常棒。我仍在調整它,但它確實有效。僅供參考,目前它實際上堅持一個success_url,但我會繼續更新此線程,因爲我弄清楚了。 –

+0

你說得對,我可以一起擺脫/ thanks/url,但我必須將我的/ contact/url分配給我的FormView的success_url變量。該消息出現在聯繫頁面,這很好。我想我現在並不需要那些精彩的感謝信息。再次感謝。 –