Formクラスの利用


Section 1. Formクラス


1. forms.Formクラス
  • Djangoが提供するフォーム処理関連カテゴリ
  • フォーム要素の作成とエラー処理などの自動化
  • 2. forms.py
  • LoginForm(forms.Form) - forms.Formクラス継承

  • 3.form要素の作成
  • username = forms.CharFieldフォーム要素の作成(文字列入力ボックス)
  • error messages={"required":}-要素に値を入力しないミラー出力文
  • を指定します.
  • widget=forms.PasswordInput-フォームタイプをパスワード
  • に指定します.
    4.clean()関数オーバーライド
  • clean()関数-clean data戻り関数
  • cleaned_data - request.POST定価
  • super().clean()で初期clean()関数を実行し、
  • を上書きします.
    if username and password:			# 아이디와 비밀번호를 모두 입력했을 경우
    try:
        user = User.objects.get(username=username)	# 입력한 아이디와 일치하는 DB 인스턴스 추출
    except User.DoesNotExist:			# 입력한 아이디와 일치하는 정보가 없는 경우
        self.add_error('username','')		# username 요소 에러 출력문에 문자열 지정
        return		
    if not check_password(password, user.password):	# 입력한 비밀번호가 다른 경우
        self.add_error('password','')		# password 요소 에러 출력문에 문자열 지정
    else:
        self.user_id = user.id			# 아이디와 비밀번호를 모두 입력하고 아이디가 존재하고 비밀번호가 일치할 때
        						# user의 id값을 form 클래스의 변수로 초기화
        
    
  • ユーザー名とパスワードが偽の場合、フォームは必要なエラー
  • を自動的に指定します.

    Section 2. View & Template


    1.ビューの変更
    if request.method == 'POST':
        form = LoginForm(request.POST) 		# form 클래스를 생성해서 form 변수에 저장 
        if form.is_valid():				# form에 에러가 없다면
            request.session['user'] = form.user_id	# form 클래스에 있는 user_id 변수 값을 'user'에 지정
            return redirect('/')			# 홈 화면으로 request를 넘김
    else:
        form = LoginForm()					# POST가 아닌 GET이므로 그냥 폼만 rendering
    return render(request, 'login.html', {'form':form})	# form 자체를 데이터로 넘김
    2.Templateの修正
  • ビューからのフォーム内のフォーム要素
  • を使用
  • field.if_for_label/field.label/field.widget.input type等抽出
  • .errors-各要素にerrors変数が存在します
  • 3.エラーが発生した場合の結果表示

    Section 3. オペレーションプロセス


    1.ログイン画面接続
        ①ユーザ登録画面要求
        ②URL分割→views.login(request)に移動
        ③POSTではなくGET方式です.
    	form = LoginForm()
        ④GETメソッドはフォーム要素のみを生成し、フォームオブジェクトに戻る(clean関数は実行しない)
        ⑤テンプレート転送
    	return render(request, 'login.html', {'form': form})
    2.ログイン要求
        ①ユーザID/PW入力後登録要求
        ②URL分割→views.login(request)に移動
        ③POST方式、入力値フォーム
    	form = LoginForm(request.POST)
        ④clean関数を実行し、上書き処理ロジックを実行する
    	def clean(self):
            	cleaned_data = super().clean()
            	username = cleaned_data.get('username')
            	password = cleaned_data.get('password')
            	if username and password:
                	try:
                    	user = User.objects.get(username=username)
                	except User.DoesNotExist:
                    	self.add_error('username', '해당 아이디가 존재하지 않습니다.')
                    	return
                    
                	if not check_password(password, user.password):
                    	self.add_error('password', '비밀번호가 틀렸습니다.')
                	else:
                    	self.user_id = user.id
         ⑤処理ロジックを完了したフォームをオブジェクトビューに転送し、以下のコードを実行する
    	form = LoginForm(request.POST)
            	if form.is_valid():
                	request.session['user'] = form.user_id
                	return redirect('/')