Djangoメモ(32) : UpdateViewでユーザーアカウント情報を編集
A Complete Beginner's Guide to Djangoのチュートリアルを参考にユーザーアカウント情報を編集してみる。
UpdateViewでユーザーアカウント情報を編集
前回まででクラスベース汎用ビューのUpdateView, ListViewを使用してみたが、UpdateViewを使用してユーザーアカウント情報の編集機能を作成してみる。
accounts/views.py
を以下のように編集。
from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.urls import reverse_lazy from django.utils.decorators import method_decorator from django.views.generic import UpdateView @method_decorator(login_required, name='dispatch') class UserUpdateView(UpdateView): model = User fields = ('first_name', 'last_name', 'email') template_name = 'my_account.html' success_url = reverse_lazy('my_account') def get_object(self): return self.request.user
model
: モデル名を指定。fields
: 編集するフィールド名を指定。template_name
: テンプレートファイル名を指定。success_url
: 正常に処理が完了した際のリダイレクト先。reverse_lazy()
はreverse()
の遅延評価版で、URLConfがロードされる前にURLの逆引きをしたい時に使う。クラスベース汎用ビューではreverse_lazy()
を使う。
myproject/urls.py
に下記行を追加。
クラスベースビューなのでaccounts_views.UserUpdateView.as_view()
のようにする。
from django.conf.urls import url from accounts import views as accounts_views urlpatterns = [ # ... path('settings/account/', accounts_views.UserUpdateView.as_view(), name='my_account'), ]
最後にtemplates/my_account.html
テンプレートを作成。
{% extends 'base.html' %} {% block title %}My account{% endblock %} {% block breadcrumb %} <li class="breadcrumb-item active">My account</li> {% endblock %} {% block content %} <div class="row"> <div class="col-lg-6 col-md-8 col-sm-10"> <form method="post" novalidate> {% csrf_token %} {% include 'includes/form.html' %} <button type="submit" class="btn btn-success">Save changes</button> </form> </div> </div> {% endblock %}
参考:
includes/form.html
(クリックで展開){% load form_tags widget_tweaks %}
{% if form.non_field_errors %}
<div class="alert alert-danger" role="alert">
{% for error in form.non_field_errors %}
<p{% if forloop.last %} class="mb-0"{% endif %}>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
{% for field in form %}
<div class="form-group">
{{ field.label_tag }}
{% render_field field class=field|input_class %}
{% for error in field.errors %}
<div class="invalid-feedback">
{{ error }}
</div>
{% endfor %}
{% if field.help_text %}
<small class="form-text text-muted">
{{ field.help_text|safe }}
</small>
{% endif %}
</div>
{% endfor %}
問題がなければ以下のフォームでユーザーアカウント情報が編集できるようになる。
fieldsの変更
その他のUserモデルのフィールドを指定することもできる。
fields = ('username', 'first_name', 'last_name', 'email', 'is_superuser', 'is_staff')
逆に限定することも可能。('email')
だとtupleではなくstrになりエラーになるので注意。
fields = ('email', )
まとめ
- UpdateViewでユーザーアカウント情報を編集
fields
で編集するフィールド名を指定- クラスベース汎用ビューでは
success_url
でreverse_lazy()
を使う