[Django]プロフィールを編集する
プロフィール編集を行えるようにします。
UpdateViewを使ってプロフィール編集
まずforms.pyに書き込みを行います。
class ProfileEditForm(forms.ModelForm): name = forms.CharField(max_length=50, required=True, widget=forms.TextInput(attrs={'placeholder': "ユーザー名"}),) email = forms.EmailField(required=True, widget=forms.EmailInput(attrs={'placeholder': "メールアドレス"}),) username = forms.CharField(max_length=50, widget=forms.TimeInput(attrs={'placeholder': "ユーザーID"}),) about_me = forms.CharField(widget=forms.Textarea(attrs={'size': 50}),) class Meta: model = User fields = ('name', 'email', 'username', 'about_me',) def __init__(self, *args, **kwargs): self.user = kwargs.get('instance', None) super().__init__(*args, **kwargs) def clean_email(self): email = self.cleaned_data["email"] try: validate_email(email) except ValidationError: raise ValidationError("正しいメールアドレスを指定してください") try: user = User.objects.get(email=email) except User.DoesNotExist: return email else: if self.user.email == email: return email raise ValidationError("このメールアドレスは既に使用されています")
次にviews.pyに追記。
from django.views.generic import CreateView, TemplateView, DetailView, UpdateView from .forms import SignUpForm, LoginForm, ProfileEditForm class ProfileUpdateView(LoginRequiredMixin, UpdateView): model = User form_class = ProfileEditForm template_name = 'users/edit.html' slug_field = 'username' slug_url_kwarg = 'username'
urls.pyも編集。
urlpatterns = [ path('signup', views.SignUpView.as_view(), name='signup'), path('login', views.LoginView.as_view(), name='login'), path('', views.IndexView.as_view(), name='index'), path('logout', views.LogoutView.as_view(), name='logout'), path('<slug:username>', views.ProfileDetailView.as_view(), name='profile'), path('<slug:username>/edit', views.ProfileUpdateView.as_view(), name='edit'), ]
templates/users/edit.htmlを作成して書き込みます。
{% extends 'base.html' %} {% block body %} <form role="form" method="post"> {% csrf_token %} <h3>プロフィール変更</h3> <div> <label for="id_name">ユーザー名:</label> {{ form.name }} </div> <div> <label for="id_email">メールアドレス:</label> {{ form.email }} </div> <div> <label for="id_username">ユーザーID:</label> @{{ form.username }} </div> <div> <label for="id_about_me">プロフィール</label> {{ form.about_me }} </div> <div> <button class="btn btn-primary" type="submit">変更</button> </div> </form> {% endblock %}
templates/users/profile.htmlも変更しておきましょう。
{% extends 'base.html' %} {% block body %} <h1>@{{ username }}</h1> <h3>{{ object.name }}</h3> <h6>{{ object.about_me }}</h6> {% if user.username == username %} <a href="{% url 'users:edit' username %}" class="btn btn-info">プロフィール編集</a> {% else %} <h2>他のユーザーのアカウントです。</h2> {% endif %} {% endblock %}
以上でプロフィール編集できるようになりました。
何かありましたら、以下に。
Twitterアカウント:じぇい👨💻 (@jyouj__) | Twitter