2-4 djangoモデル(Pythonでデータを作成、読み取り、削除、修正)、ユーザー管理

24889 ワード

障害モデルによるSQLの作成/実行(ORM)
ORM=オブジェクト関係マッピング
内蔵ORM
ORMの役割:SQLを記述する必要がなく、ストレージモデルからデータベースにアクセスできます.(クエリー/追加/変更/削除)
(重要)SQLがわからなくてもいいというわけではありません.少なくとも私が作成したコードがどのようなSQLを生成するかを検証することができます.

0.基本任務の準備


MySQL Client Unicodeでデータベースblogを作成します.
blog使用後
show tablesで確認してみます

Python端末にpip mysqlclientをインストールする
「≪設定|Setup|Eas≫」で、データベース・セクションを次のように変更します:

を選択します.
端末でPythonを管理する.pymigrateなら

無数のokを経て完成
appフォルダのタイトルは「フリー」です
ここでは板で作るつもりです.
python manage.py startapp board
ボードに行ってモデルをします.

データ・フォームの完了後
settingsへ

INSTALLED APPSに作成したappフォルダ名を記入します.
python manage.pymakemigrations boardなら
Migrations for 'board':
board\migrations\0001_initial.py
- Create model Board
そしてまた
python manage.pymigrateは完成しました
show tablesで確認してみます

board boardが追加されていることを確認できます
desc board_board; ノッキング

このようにタイプを確認できます.
djangoモデルの利用

models.理由を表す
from django.db import models

# Create your models here.
class Board(models.Model):
    title = models.CharField(max_length=200)
    contents = models.TextField()
    create_date = models.DateTimeField(auto_now_add=True)
こうやってclass board
次に、受信したデータがpostの場合に使用されるformsというpyファイルを作成します.
from django import forms
from .models import Board



class BoardForm(forms.ModelForm):
    class Meta:
        model = Board
        fields = ('title', 'contents')
入力
# html에서 다음과 같이 폼에다가 input넣지 않아도 됨 
# fields값 안에 title과 contents가  input name에 해당
# <!--<form method="post" action="/board/register">-->
# <!--	{% csrf_token %}-->
# <!--	<input type="text" name="title">-->
# <!--	<input type="text" name="content">-->
# <!--	<input type="submit">-->
# <!--</form>-->
<form action = "/board/register" method="post">
   {% csrf_token %}
   {{ boardForm }}
   <input type="submit">
</form>
これらを入力するだけで、上のキャラクターに代わることができます.

1.データの作成


1) views.pyコンテンツ

def register(request):
    if request.method == "GET":   	
    	#만약 요청이 겟 방식이면
        boardForm = BoardForm()	  	
        #import한 forms. 안의 값인 BoardForm의 값을 board form에 저장합니다.
        return render(request, 'board/register.html',  
                      {'boardForm':boardForm}) 
# 그 후 함수는 board/register.html을 보여주고 위에서 저장한 데이터를 'boardForm'에 저장합니다.
# render라는 함수가 boardForm의 데이터 board폴더에 forms.py 안에 있는 데이터  받아와 board/register.html을 완성시킨다는 개념
이때 'boardForm'은 register.html에서 
<form action = "/comment/register" method="post">
    {% csrf_token %}
    {{ commentForm }}
    <input type="submit">
</form>
폼 안에 {{}}부분에 해당하게된다.
    elif request.method == "POST" :
        boardForm = BoardForm(request.POST)
        만약 요청이 POST 방식이라면 
        #import한 forms. 안의 값인 BoardForm인 입력받은 POST 
        값을 board form에 저장합니다.
        # 모델폼을 이용하면 알아서 다 받아짐
        if boardForm.is_valid():   
        	#boardForm안에 값이 유효한다면
            board = boardForm.save(commit=False)
            #board라는 변수에 BoardForm(request.POST)에서 받아온 값을 저장한다.
            board.save()
            #그후 board를 저장하고
            return redirect('/board/register')
            # 패쓰값 /board/register로 가고 그러면 url로 인해 다시 처음의 def register가 실행됨
           
入力すると、アドレスhttp://127.0.0.1:8000/board/register理由を表すに入力ボックスがあり、ここに値を入力すると、データベースに格納されます.

この値を読み込み、他のページに表示するには
views.理由を表す
def posts(request) :
    posts = Board.objects.all()     #board table에서 모든 데이터를 다 가져옴

    return render(request, 'board/list.html',
                  {'posts': posts})
作成します.
urlにパスを設定します.
path('board/list',board.views.posts)

2) list.htmlコンテンツ

{% if posts %}   <!--posts안에 데이터가 담겨 있으면 반복문을 실행한다. -->
        {% for post in posts %}   <!--posts안에 있는 것을 하나하나 꺼내서 post에 저장한다  파이썬과 용법 동일함 -->
          <div>
            <tr>
              <td> {{post.id}} </td>  <!--post라는 객체 안에 있는 id를 보여준다 -->
              <td> {{ post.title }} </td>
              <td> {{ post.create_date }}  </td>
            </tr>
          </div>
        {% endfor %}
      {% endif %}
次のように条件文を繰り返します.

この形式で出力できます.

2.データの読み出し


1) views.pyコンテンツ

def read(request, bid) :
    post = Board.objects.get( Q(id=bid)) 
    #posts = Board.objects.all()     
    위의 내용은 board table에서 모든 데이터를 다 가져오는 것이고 조건을 지정하려면
    .all이 아닌 .get을 사용
    bid에 해당하는 내용이 post에 담기고 게시글의 id를 불러올 것이다
    bid는 사용자가 요청한 게시글에 대한 얘기
    return render(request, 'board/read.html',{'read' : post})
    #board/read.html페이지를 보여주고 Board.objects.get( Q(id=bid))의 값
    을 'read'로 저장한다.
    

2) read.htmlコンテンツ


    {% if read %}   <!--read안에 데이터가 담겨 있으면 반복문을 실행한다. -->
              <div>
                <tr>
                  <td> {{read.id}} </td>  <!--read라는 객체 안에 있는 id를 보여준다 -->
                  <td> {{read.title }} </td>
                  <td> {{read.contents}}  </td>
                  <td> {{read.create_date }}  </td>
                </tr>
              </div>

    {% endif %}
    

3.データの削除


1) view.py

def delete(request, bid) :
    post = Board.objects.get(Q(id = bid))
    post.delete()
    post는 Board에서 특정조건 id의 값을 저장
    그후 그 값을 삭제
    return redirect('/board/list')
    패스 /board/list로 이동

2) delete.html


コンテンツを削除したのでありません...

4.データの修正


1) view.py

def update(request, bid) :
    post = Board.objects.get(Q(id=bid))  #게시글 하나를 가져오는것
    if request.method == "GET" :
        boardForm = BoardForm(instance=post)  
        #특정 조건 id에 해당하는 값을 저장한다.
        return render(request,'board/update.html',{'boardForm' : boardForm})
    elif request.method == "POST" :
        boardForm = BoardForm(request.POST)
        # boardForm에서 사용자가 보내온 데이터를 받느다
        if boardForm.is_valid():   #boardForm안에 값이 유효한다면
            post.title = boardForm.cleaned_data['title']
            #boardForm의 값이 출력되면 html의 형식까지 모든게 서버로 보내지기 때문에
            우리가 필요한 값 'title'만 뽑아내기 위해 cleaned_data를 사용한다.
            post.contents = boardForm.cleaned_data['contents']
            post.save()
            return redirect('/board/list')

2) update.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form  method = "post">
        {% csrf_token %}
        {{boardForm}}
        <input type = 'submit'>
<!--   form에는 원래 버튼을 누르면 action이라고 적힌 부분을 반복하지만 없기 때문에 현재 url로 보낸다.-->


    </form>
</body>
</html>

5.会員管理の作成


1)会員収入


既存はデータ受信時のモデルです.pyに入力する値を指定して使用しましたが、今回はdjangoで指定した値のみを使用します.

(1) views.py

def signup(request):
    if request.method == "GET":
        signupForm = UserCreationForm()
        #UserCreationForm()이 장고가 제공하는 것 
        return render(request, 'users/signup.html',{'signupForm': signupForm})

    elif request.method == "POST" :
        signupForm = UserCreationForm(request.POST)
        if signupForm.is_valid():
            signupForm.save()
            return redirect('/users/signup')

(2) html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action = "/users/login" method="post">
    {% csrf_token %}
    {{ loginForm }}
    <input type="submit">
</form>


</body>
</html>
ユーザー/ログイン

次のように、プリセットウィンドウを表示して値を入力します.
パスワードの場合、次のルールを満たさないとエラーが発生します.
post形式で受信したデータはmysqlclientにテーブルがあります

auth userに保存します.
select from auth_user\G; これにより、格納されているデータを1つずつ表示できます.

selectfrom auth userを表形式で表示できます

資料が増えているので、特定のIDだけを見たいなら
select * from auth_user where username = 'kst511313'\G; 条件を一緒に賭けることができます.

2)ログイン


(1) views.py

def userlogin(request) :
    if request.method == "GET":
        loginForm = AuthenticationForm()     <-- 장고가 제공하는 로그인 폼
        return render(request, 'users/login.html',{'loginForm': loginForm})
    elif request.method == "POST" :
        loginForm = AuthenticationForm(request, request.POST) 
        # 로그인만은 신기하게 (request.POST)가 아닌 (request, request.POST)를 사용한다.
        if loginForm.is_valid():    #검증단계
            login(request, loginForm.get_user())
            return redirect('/board/list')
        else :
            return redirect('/users/login')

(2) userlogin.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action = "/users/login" method="post">
    {% csrf_token %}
    {{ loginForm }}
    <input type="submit">
</form>


</body>
</html>
htmlは既存のフォーマットと同じで、その内容のみを表示します.pyの特定の関数で送信された値に置き換えるだけです.

3)ログアウト


(1) views.py


def userlogout(request) :
    logout(request)
    return redirect('/users/login')