2013-02-26 48 views
1

我是Django的新手,我想在基本html中包含我的登錄表單。在base.html中包含Django登錄表單

我有以下:

「註冊/ login.html的」

{% if form.has_errors %} 
    <p>Your username and password didn't match. 
     Please try again.</p> 
{% endif %} 
<form method="post" action="."> 
    {% csrf_token %} 
    <p><label>Username:</label> 
     {{ form.username }}</p> 
    <p><label>Password:</label> 
     {{ form.password }}</p> 
    <input type="submit" value="login" /> 
    <input type="hidden" name="next" value="/" /> 
</form> 

urls.py

url(r'^login/$', 'django.contrib.auth.views.login'), 

而我包括在base.html文件執行以下操作:

{% include "registration/login.html" %} 

它呈現每除用於用戶名和密碼的文本框外。我想我錯過了一些東西。

+0

它呈現提交按鈕嗎? – bluszcz 2013-02-26 10:10:51

+0

是的,呈現登錄按鈕。 – glarkou 2013-02-26 10:14:37

+0

ewen是正確的我只是刪除了我的答案 – catherine 2013-02-26 10:21:37

回答

7

好的,我認爲這個問題是你期待的「魔法」。

Django的意見是模板是非常愚蠢的。他們只有那些在以下兩種方式之一通過提供給他們的變量:

  1. 通過一個context_processor(見艾丹的答案)
  2. 傳遞調用時渲染(或選擇render_to_response)

中當您訪問/login時,原因表單呈現,但在其他情況下,因爲您使用的Django視圖django.contrib.auth.views.login將Django AuthenticationForm傳遞給您的模板。

查看源位置: https://github.com/django/django/blob/master/django/contrib/auth/views.py

沒有其他視圖「神奇地」獲取變量集。

所以你必須要麼:

  1. 它自己設定在每個視圖在您的整個應用程序
  2. 使用上下文處理器。

下面是一個簡單的context_processors.py它使用Django的東西(基於Aidan的):

def include_login_form(request): 
    from django.contrib.auth.forms import AuthenticationForm 
    form = AuthenticationForm() 
    return {'login_form': form} 

然後,執行作爲艾丹指出:

TEMPLATE_CONTEXT_PROCESSORS = (
    #.... 
    'yourapp.context_processors.include_login_form' 
) 

現在的問題是,當你只包含模板時,登錄表單就在一個名爲「login_form」的變量中,但是當django的內置視圖使用你的模板時,它就在一個名爲「form」的變量中。

所以這是一個沒有好的「乾淨」解決方案的考驗,但我確信可以把它整理出來。

也許檢查在context_processor中傳入的上下文,如果一個變量已經存在,稱爲「form」,看它是否是AuthenticationForm的一個實例,如果是,則改爲使用它。

+0

我認爲這是OP要求的答案。從我+1。 – 2013-02-26 10:54:52

+0

您可以發表一個關於如何在模板中使用這個上下文處理器的例子嗎? – glarkou 2013-02-26 11:01:01

+0

上下文處理器只是將它們的變量添加到每個視圖(只要所述視圖使用RequestContext)。所以你只需更新現有的模板,用「login_form」替換「form」(儘管如果你嘗試使用contrib視圖,就會中斷) – 2013-02-26 11:03:17

1

我聽起來像表單實際上並沒有傳遞給模板。如果您希望每個頁面都包含登錄表單,那麼您可能需要添加context processor

創建context_processors.py文件,像 -

def include_login_form(request): 
    form = YourLoginForm() 
    return {'login_form': form} 

然後添加新的背景處理器的TEMPLATE_CONTEXT_PROCESSORS設置 -

TEMPLATE_CONTEXT_PROCESSORS = (
    #.... 
    'yourapp.context_proecssors.include_login_form', 
) 

這將意味着上下文變量login_form是提供給所有你的模板。

+0

所以我不能再使用django.contrib.auth.views.login了,我必須創建自己的登錄表單嗎? – glarkou 2013-02-26 10:26:40

+0

你可以。回答我的問題,我會解釋。 – 2013-02-26 10:33:08

+0

是@JackShedd。這很好。 – glarkou 2013-02-26 10:37:16