ゆーじぇいブログ

ゆーじぇいブログ

プログラミングとか色々

[Django]プロフィールを編集する

f:id:jyouj:20181124164719j:plain

 プロフィール編集を行えるようにします。

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