2

ブートストラップ ドロップダウン サインイン フォームを使用してユーザーをログインさせようとしています。ユーザー名とパスワードをハードコーディングして問題なく認証できますが、ログイン画面に移動せずにユーザーをログインさせようとしています。これが私のコードです:

テンプレート: アクションを使用して logUserIn URL を呼び出し、フォームがそのビューに投稿できるようにします。

<ul class="nav pull-right">
          {% if user.is_authenticated %}
          <li><a> Welcome {{ user.first_name }} </a></li>
          <li class="divider-vertical"></li>
          <li><a href="{% url 'caesarWorkflowApp.views.logUserOut' %}">Log Out</a></li>
          <li class="divider-vertical"></li>
          {% else %}
          <li class="dropdown">
            <a class="dropdown-toggle" href="#" data-toggle="dropdown">Sign In <strong class="caret"></strong></a>
            <div class="dropdown-menu" style="padding: 15px; padding-bottom: 0px;">
              <form action="{% url 'caesarWorkflowApp.views.logUserIn' %}" method="post" accept-charset="UTF-8">
                {% csrf_token %}
                <input id="user_username" style="margin-bottom: 15px;" type="text" name="username" placeholder="Username" size="30" />
                <input id="user_password" style="margin-bottom: 15px;" type="password" name="password" placeholder="Password" size="30" />
                <input id="user_remember_me" style="float: left; margin-right: 10px;" type="checkbox" name="user[remember_me]" value="1" />
                <label class="string optional" for="user_remember_me"> Remember me</label>
                <input class="btn btn-primary" style="clear: left; width: 100%; height: 32px; font-size: 13px;" type="submit" name="commit" value="Sign In" />
              </form>
            </div>
          </li>
            {% endif %}
          <li class="divider-vertical"></li>
        </ul>

ここに画像の説明を入力

URL:

urlpatterns = patterns('',
    url(r'^$', 'caesarWorkflowApp.views.home', name='default'),
    url(r'^$', 'caesarWorkflowApp.views.logUserIn'),
    url(r'^$', 'caesarWorkflowApp.views.logUserOut'),
)

ビュー: 次に、フォームが正常に投稿されているにもかかわらず、コンソールが「入力」を出力することさえないため、機能しないログイン用のこのビューがあります。私は間違って投稿していますか?間違ったアクションを呼び出していますか? テンプレートを作成せずにログイン/ログアウトビューを作成して、ホームページを更新/リダイレクトする方法を知っている人はいますか?

def logUserIn(request):
    if request.method == 'POST':
        print 'enter'
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            # the password verified for the user
            if user.is_active:
                login(request, user)
                print("User is valid, active and authenticated")

            else:
                print("The password is valid, but the account has been disabled!")
        else:
            # the authentication system was unable to verify the username and password
            print("The username and password were incorrect.")

    response = render_to_response('home.html', {}, context_instance=RequestContext(request))
    return response

また、投稿フォームであるため、リロードするかどうかをページに尋ねないようにしたいと思います。これは、誰かがそれに興味を持っている場合の解決策だと思います:ブラウザが更新時にフォームデータを再送信するように要求するのをやめますか?

ありがとうございました!

4

2 に答える 2

3

あなたが探しているのは AJAX と呼ばれるものです。私はいつもjQueryを使って AJAX リクエストを処理していました。

これが私が通常どのように進めるかです:

  1. Django プロジェクト内にアプリケーションを作成ajaxして、AJAX ビューと URL を残りのコードから遠ざけます (また、あるプロジェクトから別のプロジェクトにアプリケーションを再利用するのが好きです)
  2. ajaxアプリケーション内で AJAX ビューとその URL をコーディングする
  3. jQuery を使用してフォームに AJAX リクエストを適用する

テンプレート

<form id="form-login" action="" method="post">
{% csrf_token %}
<!-- Put your form here -->
<button type="submit">submit</button>
</form>

JavaScript

$(document).ready(function() {
    $("#form-login").submit(function() {
        jQuery.ajax({
            "data":    $(this).serialize(),
            "type":    $(this).attr("method"),
            "url":     "{% url 'login-submit' %}",
            "success": function(response) {
                switch(response.code) {
                    // Do what you want with the received response
                }
            }
        });
        return false;
    });
});

AJAX URL

urlpatterns = patterns('',
    url(r'^ajax/login/submit/$', 'path.to.login_submit', name='login-submit'),
)

AJAX ビュー

@require_AJAX
def login_submit(request, label):
    # Code here the logging logic 
    response = HttpResponse(json.dumps({'code':'42'}), content_type='application/json')
    return response

デコレータについては、この回答を参照してください。require_AJAX

フォームの送信に関しては (ロギングだけでなく) AJAX をよく使用するため、上記の JavaScript コードをすべてのフォームに適用します ( を使用$("form").submit(...);)。ただし、投稿するフォームをビューに知らせる必要があります。必要な場合に備えて、次のように進めます。

  • 最初に、URL に引数 (フォームの ID) を入力する必要があります。
  • 次に、関連付けられたビューは、対応するラベルでどのケースを処理するかを知ることができます
于 2013-07-12T19:18:48.033 に答える