【Django】forms.pyでrequestのログインユーザー情報を取得する

djangoのforms.pyでrequestの情報をキャッチして、ユーザーが持っている情報を操作したり、例えばユーザー照合を行ったりしたいことはありませんでしょうか?

実際の動画を基に、html、views、forms側での処理を網羅的に説明していきます。

やりたいこと

例えば上の動画のように、ログイン中のユーザーと入力されたユーザー名がイコールであるかを確認する時を想定します。

inputフォームに入力して欲しいのは、request.user(ここではadmin)になりますが、もしもadminと入力して欲しいところが、違う入力(この動画ではxyz)をした場合はforms.pyでバリデーションエラーを出現させたいところです。

views側での処理をさせてもいいのですが、餅は餅屋でforms側で処理は任せたいところです。

しかしながら、どうやってforms.pyでログイン中のユーザーをrequestから取ってくるのでしょうか?

書いたコード

views側に存在するrequestをformインスタンスを作成する際に、引数としてログインユーザー情報を渡します。

sample.html

<p>確認のため、<span class="clearly">{{ request.user }}</span> を入力してください。</p>
<form action="" method="post">
{% csrf_token %}
{{ form.username }}
{{ form.username.errors }}
<button type="submit">削除する</button>
</form>

Djangoで用意されているテンプレートでは、ログイン中に{{ request.user }}と記述すればログイン中のユーザー名を表示させることができます。

{{ form.username }}{{ form.username.errors }}の中身はこの後のforms.pyで紹介していきます。

forms.py

forms側ではviews側からrequestデータを受け取るために諸所準備が必要です。

from django import forms
from django.core.exceptions import ValidationError

class DelRecordForm(forms.Form):
    """履歴削除"""
    username = forms.CharField(
        required=True,
        min_length=3,
        max_length=16,
        widget=forms.TextInput(
            attrs={
                'placeholder': ''
            }
        )
    )

    def __init__(self, user, *args, **kwargs):
        self.login_user = user
        super().__init__(*args, **kwargs)

    def clean_username(self):
        username = self.cleaned_data['username']
        if str(self.login_user) != username:
            raise ValidationError('無効な値が入力されています。')
        return username

注目すべきは17-19行目のdef __init__で定義したコンストラクタです。

引数に、user及び、*argsと**kwargsを定義することで、views側からrequest.get、request.post以外のデータを受け取れるようにしています。

ここで引数として定義されているuserとは、views側から何を渡されているのかを次のviews.py側で説明していきます。

(*argsと**kwargsの説明に関しては過去記事でしております。)

views.py

forms.pyのDelRecordFormに何を変数として渡しているのかを主に説明します。

from jrfoodadv.forms import DelRecordForm

def del_record(request):
    if request.method == 'GET':
        form = DelRecordForm(user=request.user)
    elif request.method == 'POST':
        form = DelRecordForm(user=request.user, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            print('削除されます')

    context = {
        'form': form,
    }
return render(request, 'sample.html', context)

6行目以降のPOST時の処理はDelRecordFormに対して、request.POST以外にもuser=request.userを渡しています。

こうすることで、forms.pyのDelRecordFormで受け取ったrequest.userを使用できるようになります。

request.userは ログイン中のユーザー名及びユーザー情報が詰め込まれています。

今回はforms側の23行目で、str()で囲むことで文字列を利用しています。

以上。

最後に

いかがでしたでしょうか。

以上が、「【Django】forms.pyでrequestのログインユーザー情報を取得する」の紹介記事になります。

プログラミング学習を効率良く進めるには…

私ヒロヤンがプログラミングを始めた頃は以下のような感じでした。

何から手をつけていいのか、わからない。

プログラミングを始めてみたけど、エラーが解決できない。

そしてネットで調べていくうちに膨大な時間が過ぎていきました。

私ヒロヤンの実体験より、プログラミングを効率的に学ぶために大切なことは以下のことだと考えています。

1. いつまでもダラダラとやらないで、目標を決定して短期集中する

2. マンツーマンで、わからない箇所は直ぐに質問をして即レスをもらう

.proでは私ヒロヤンが学習してきたプログラミング経験0からのpython/django、その他webサイト・サービス開発のコースが用意されています。

カウンセリング自体は無料なので話を聞いてみるだけでもいかがでしょうか?

また以下のリンク先ではPythonを教えてくれるスクールをまとめ紹介しています。