ところでpostとgetはどう違うのか
ブラウザからリクエストを投げる時に、追加で入れていく情報の種類、情報の送り方
djangoを使う時は下記の理解でとりあえずOK
フォームを送信するとき→post
それ以外のとき→get
例えば
一般的にページに貼られているリンクをクリックした時は、getでサーバーにリクエストを送っている。
postの場合は、サーバーにフォームを送る時に明示的に表している
なので、signup.htmlを下記のようにPOSTを追加する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{% extends 'base.html' %} {% block content %} <form class="form-signin" method="POST"> <img class="mb-4" src="/docs/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72"> <h1 class="h3 mb-3 font-weight-normal">Please sign up</h1> <label for="inputEmail" class="sr-only">Email address</label> <input type="text" id="inputEmail" class="form-control" name='username' placeholder="username" required autofocus> <label for="inputPassword" class="sr-only">Password</label> <input type="password" id="inputPassword" class="form-control" name='password' placeholder="Password" required> <div class="checkbox mb-3"> </div> <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> <p class="mt-5 mb-3 text-muted">© 2017-2020</p> </form> {% endblock content %} |
views.pyもそれが見えるように改変する
下記、は根本的な部分で間違ってたので、時系列的に少し変になっています
1 2 3 4 5 6 7 8 9 10 11 12 |
from django.shortcuts import render from django.contrib.auth.models import User # Create your views here. def signupfunc(request): if request.method =='POST': username = request.POST['username'] password = request.POST['password'] user = User.objects.create_user(username, '', password) return render(request, 'signup.html', {'some':100}) return render(request, 'signup.html', {'some':100}) |
これが何をしているかというと、POSTで送られた時のusernameを格納する返信を作っている。
このusernameはsignup.htmlで定義されているnameとなっている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{% extends 'base.html' %} {% block content %} <form class="form-signin" method="POST" action=''>{% csrf_token %} <img class="mb-4" src="/docs/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72"> <h1 class="h3 mb-3 font-weight-normal">Please sign up</h1> <label for="inputEmail" class="sr-only">Email address</label> <input type="text" id="inputEmail" class="form-control" name='username' placeholder="username" required autofocus> <label for="inputPassword" class="sr-only">Password</label> <input type="password" id="inputPassword" class="form-control" name='password' placeholder="Password" required> <div class="checkbox mb-3"> </div> <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> <p class="mt-5 mb-3 text-muted">© 2017-2020</p> </form> {% endblock content %} |
3行目のactionはsigninを押した後に、どの画面に飛ばすかを制御するもの”となっているので同じ画面になる。
ただ、押した後は、views.pyにあるifに引っかり、usernameが変数に格納された状態でsignup.htmlを再読み込みする状態となる。
※ {% csrf_token %}はセキュリティ上のおまじない
このままだとデータベースが作られていないのでmakemigrationsでデータセットを作る
1 2 3 |
python3 manage.py makemigrations python3 manage.py migrate |
1 |
python3 manage.py createsuperuser |
その上でスーパーユーザーを作成する
その後サーバーを起動する
1 |
python3 manage.py runserver |

サインアップ画面で、sato、パスワードを入力してから、スーパーユーザーとしてログイン

からログインする

サインイン画面で入力したユーザーがここに記憶されていれば成功
userテーブルの中身を見てみる
views.py 10行目の
user = User.objects.create_user(username, ”, password)
これが何なのか調べるために、ちょっと改変する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from django.shortcuts import render from django.contrib.auth.models import User # Create your views here. def signupfunc(request): user2 = User.objects.all() print(user2) if request.method =='POST': username = request.POST['username'] password = request.POST['password'] user = User.objects.create_user(username, '', password) return render(request, 'signup.html', {'some':100}) return render(request, 'signup.html', {'some':100}) |

一度クリックしてみると

こんな感じでユーザー一覧が出てくる
ここでadmin画面からもう一度入ってみて、スーパーユーザーのaaaにメールアドレスを設定してみる

views.pyの7,8行目については
1 2 |
user2 = User.objects.get(username='sato') print(user2.email) |
とするとsatoのメールアドレスを引っ張ってくることができる
重複ユーザーを防ぐ方法
サインインのあったユーザー名と、データベース上のユーザー名を突き合わせて、いなかったら通常の処理をする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from django.shortcuts import render from django.contrib.auth.models import User # Create your views here. def signupfunc(request): if request.method =='POST': username2 = request.POST['username'] password2 = request.POST['password'] try: User.objects.get(username=username2) return render(request, 'signup.html', {'error':'このユーザーは登録されています'}) except: user = User.objects.create_user(username, '', password2) return render(request, 'signup.html', {'some':100}) return render(request, 'signup.html', {'some':100}) |
signup.htmlで表示させる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{% extends 'base.html' %} {% block content %} <form class="form-signin" method="POST" action=''>{% csrf_token %} <img class="mb-4" src="/docs/4.5/assets/brand/bootstrap-solid.svg" alt="" width="72" height="72"> <h1 class="h3 mb-3 font-weight-normal">Please sign up</h1> {% if error %} {{ error }} {% endif %} <label for="inputEmail" class="sr-only">Email address</label> <input type="text" id="inputEmail" class="form-control" name='username' placeholder="username" required autofocus> <label for="inputPassword" class="sr-only">Password</label> <input type="password" id="inputPassword" class="form-control" name='password' placeholder="Password" required> <div class="checkbox mb-3"> </div> <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> <p class="mt-5 mb-3 text-muted">© 2017-2020</p> </form> {% endblock content %} |
サーバーを立ち上げて、satoでサインインしてみると

うまくいきました。
![]() |
![]() |
---|
コメントを残す