ところでpostとgetはどう違うのか
ブラウザからリクエストを投げる時に、追加で入れていく情報の種類、情報の送り方
djangoを使う時は下記の理解でとりあえずOK
フォームを送信するとき→post
それ以外のとき→get
例えば
一般的にページに貼られているリンクをクリックした時は、getでサーバーにリクエストを送っている。
postの場合は、サーバーにフォームを送る時に明示的に表している
なので、signup.htmlを下記のようにPOSTを追加する
{% 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もそれが見えるように改変する
下記、は根本的な部分で間違ってたので、時系列的に少し変になっています
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となっている。
{% 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でデータセットを作る
python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py createsuperuser
その上でスーパーユーザーを作成する
その後サーバーを起動する
python3 manage.py runserver

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

からログインする

サインイン画面で入力したユーザーがここに記憶されていれば成功
userテーブルの中身を見てみる
views.py 10行目の
user = User.objects.create_user(username, ”, password)
これが何なのか調べるために、ちょっと改変する
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行目については
user2 = User.objects.get(username='sato')
print(user2.email)
とするとsatoのメールアドレスを引っ張ってくることができる
重複ユーザーを防ぐ方法
サインインのあったユーザー名と、データベース上のユーザー名を突き合わせて、いなかったら通常の処理をする。
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で表示させる
{% 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でサインインしてみると

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