django備忘録21 Login Form in Bootstrap Navbar
参照サイト
bootstrapのformについては、こちらのサイトが非常にわかりやすかったです!
Navbarを利用したLogin formを作成
- navbar.html にフォームタグを追加する。 class=navbar-form→navbarのフォーム class=navbar-right→navbarの右側(右寄せ?)に配置
<form class='navbar-form navbar-right' method='POST' action=''>{% csrf_token %} </form>
- さらにnavbar.htmlを修正 form-group は、formの配置を自動的に綺麗にしてくれるためのclassのようです。
<form class='navbar-form navbar-right' method='POST' action=''>{% csrf_token %} <div class='form-group'> </div> <div class='form-group'> </div> <button type='submit' class='btn btn-default'>ログイン</button> </form>
- さらに、フォームを完成させていく。 form-controlなどを追加していく。type フォームの種類、class=フォームcontrol
<form class='navbar-form navbar-right' method='POST' action=''>{% csrf_token %} <div class='form-group'> <input type='text' class='form-control' name='username' placeholder="ユーザー名" /> </div> <div class='form-group'> <input type='password' class='form-control' name='password' placeholder="パスワード" /> </div> <button type='submit' class='btn btn-default'>ログイン</button> </form>
ログインボタンはできたので、削除しておく
さらに上記のフォームを is_authenticatedのelseの後に入れておくか、もしくは、 {% if not request.user.is_authenticated %} を設置してそのあとに入れる。
navbar ログインのactionを設定する前に動作を確認する。 accounts/login 画面で、入力した時などの動作を確認する。
例えば、formsタグのところは、以下のようになっている。 多分、重要なのは、name= の所。ここは上記で設定したnameと同じなので、良さそう。
<form method="post" action="."> <input type="hidden" name="***" value="***"> <div id="div_id_username" class="form-group"> <label for="id_username" class="control-label requiredField"> ユーザ名<span class="asteriskField">*</span> </label> <div class="controls "> <input class="textinput textInput form-control" id="id_username" maxlength="254" name="username" type="text"> </div> </div> <div id="div_id_password" class="form-group"> <label for="id_password" class="control-label requiredField"> パスワード<span class="asteriskField">*</span> </label> <div class="controls "> <input class="textinput textInput form-control" id="id_password" name="password" type="password"> </div> </div> <input class="btn btn-block btn-primary" type="submit" value="Submit"> <input type="hidden" name="next" value=""> </form>
- データの整合性取れそうなので、以下のようにurl "auth_login" でreverseで、ログインurlにデータを送付する。(データというのは、この場合、usernameと、password)
<form class='navbar-form navbar-right' method='POST' action='{% url "auth_login" %}'>{% csrf_token %}
ちなみにログインに失敗した場合は、再度login_urlが表示される。なぜなら、多分、auth_loginのviewでredirectが多分設定されているから??
また、accounts/loginの画面を開いている時は、ログインフォームが2つあることになってしまうため、表示させないようにする。そのための設定は以下のような感じ。
navbar.html
... {% if not request.user.is_authenticated and not "/accounts/login" in request.get_full_path %} ...
ちなみに、 not "/accounts/login" in request.get_full_path は、/accounts/login が、今のページのfullpathに含まれていない場合という意味!