2

Django を初めて使用するので、ログイン フォームをベース html に含めたいと考えています。

私は次のものを持っています:

「登録/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" %}

ユーザー名とパスワードのテキストボックスを除くすべてをレンダリングします。私は何かが欠けていると思います。

4

2 に答える 2

9

OK、問題は、あなたが「魔法」を期待していることだと思います。

Djangoの見解は、テンプレートがかなり馬鹿げていることです。それらには、次の2つの方法のいずれかで渡される変数のみが使用可能です。

  1. context_processorを介して(Aidanの回答を参照)
  2. render(またはrender_to_response)を呼び出すときに渡されます

にアクセスしたときにフォームがレンダリングされる理由は、/login他の場合ではなく、使用しているDjangoビューがDjangoAuthenticationFormをdjango.contrib.auth.views.loginテンプレートに渡したためです。

ここでソースを確認してください: 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}

次に、Aidanが指摘するように実行します。

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

ここで問題となるのは、テンプレートを含めるだけの場合、ログインフォームは「login_form」という変数にありますが、djangoの組み込みビューがテンプレートを使用する場合、「form」という変数にあるということです。

ですから、それは良い「クリーンな」解決策のない試練ですが、それを解決できると確信しています。

たぶん、context_processorで渡されたコンテキストをチェックし、「form」という変数がすでに存在する場合は、それがAuthenticationFormのインスタンスであるかどうかを確認し、存在する場合は代わりに使用します。

于 2013-02-26T10:42:20.943 に答える
2

フォームが実際にテンプレートに渡されていないようです。すべてのページにログイン フォームを含めたい場合は、おそらくコンテキスト プロセッサを追加する必要があります。

次のような 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がすべてのテンプレートで使用できることを意味します。

于 2013-02-26T10:18:17.587 に答える