2015-07-10 53 views
1

我正在構建的網站有一個登錄表單,作爲base.html模板的一部分,所有其他模板都可以擴展;作爲這個的結果,我需要以某種方式處理每一頁上的登錄/註銷邏輯。基本模板上的Django表單

當前每個頁面都被加載到一個單獨的視圖中,那麼實現它的最好和最乾的方法是什麼?我正在閱讀的所有教程都將登錄頁面分開。

編輯:

我原來的方法,使形式的行動總是加載指數與然而相當多的工作,我的事實惱火,我不能將用戶重定向回他們登錄之前,無論他們是in。

之後我決定重新設計表單作爲Django ModelForm,這樣我就可以引發我以前沒做過的驗證錯誤,但現在模板只有通過索引視圖呈現時才具有ModelForm對象所以輸入框甚至不會在其他頁面上呈現。

+0

所以你在說什麼是你目前在每個視圖中執行表單邏輯,而不是一次執行? –

+0

是的,我可能在將來有更多的意見,它似乎ridicoulus – davegri

回答

2

您可以在模板中檢查登錄表單代碼。

您可以將登錄模板放入base_login.html並在每個頁面上擴展它。

樣品基本模板代碼:

{% if not user.is_authenticated %} 
    <form action="{% url my_login_url %}" method="POST"> 
     {% csrf_token %} 
     <input id="username_field" name="username" type="text" /> 
     <input id="password_field" name="password" type="password" /> 
     <button type="submit">Login</button> 
    </form> 

此登錄形式將顯示僅當用戶沒有被認證。

然後寫一個login頁面的視圖和一個LoginForm來處理登錄過程。

views.py

class LoginView(FormView): 

    ... 
    your login and redirection logic here 
    ... 

forms.py

class LoginForm(forms.Form): 

    username = .. 
    password = .. 

    ... 
    your form validations and other logic 
    ... 

所以,無論是任何頁面,登錄表單將只顯示,如果用戶沒有的loggedIn,所有這些登錄請求將僅限於您的LoginView。 您不必擔心在每個視圖中處理登錄邏輯。

+1

爲了擴大這一點,你可以(也應該,根據DRY原則)將這段代碼放置在一個'base_login.html'文件中駐留在與你的應用程序分開的目錄,並且你使用[extends](https://docs.djangoproject.com/en/1.7/topics/templates/#template-inheritance)標籤包含在每個模板中(我建議這樣做以及任何其他重複的代碼)。然後,在你的'settings.py'中,只需將目錄添加到'TEMPLATES'的'DIRS'選項[(請參閱此鏈接瞭解詳情)](https://docs.djangoproject.com/en/1.8/topics/templates /) –

+1

是的,我們可以做到這一點。那將是DRYer方法。將它添加到ans。 –

+0

我想我可能會對視圖和網址的概念感到困惑 – davegri

1

最好的選擇是創建一個HEADER.HTML模板,並在include的幫助下將它包含在base.html中。 這將是一個更好的選擇,然後在base.html中創建或顯示錶單,您也可以對頁腳執行相同的操作。

+0

這是怎麼比一個帶有頁眉和頁腳的骨架base.html更好? – davegri