ゆーじぇいブログ

ゆーじぇいブログ

プログラミングとか色々

[Django]退会機能を実装する

f:id:jyouj:20181124164719j:plain

Webサービスを開発するときに用意しておかなければならないのが退会機能。それをDjangoで作る機能をご紹介します。

退会

退会機能は他のユーザーからアクセスされては困るので、制限をかけときます。

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin

class OnlyYouMixin(UserPassesTestMixin):
    raise_exception = True

    def test_func(self):
        user = self.request.user
        return user.username == self.kwargs['username'] or user.is_superuser

これをUserDeleteViewに継承させます。これで他人からはアクセスできないようにします。

class UserDeleteView(OnlyYouMixin, generic.DeleteView):
    template_name = "registration/delete.html"
    success_url = reverse_lazy("user_auth:login")
    model = User
    slug_field = 'username'
    slug_url_kwarg = 'username'

さてさて、urls.pyも追加しておきましょう。

path('<str:username>/delete/', views.UserDeleteView.as_view(), name='delete'),

そして、退会ページを作っていきましょう。

{% extends 'base.html' %}

{% block body %}
<section class="hero">
  <div class="hero-body">
    <div class="container">
      <h1 class="title">
        退会
      </h1>
    </div>
  </div>
</section>

<form role="form" method="post">
  {% csrf_token %}
  <p>あなたのアカウント「@{{ user.username }}」を、本当に削除してもよろしいですか?</p>

  <button type="submit" class="button is-danger">削除</button>
  <a href="javascript:void(0);" onclick="window.history.back();" class="button is-text">キャンセル</a>
</form>
{% endblock %}

href="javascript:void(0);" onclick="window.history.back();"

これは一つ前のページに戻るJavaScriptのコードです。CSSはBulmaを使っています。便宜読み替えてください。

問題は、退会ページにアクセスする際のことです。ログインしてない状態で退会ページにアクセスすることはできません(テンプレートの方でエラーが出る)。

なので、if文を使います。

{% if user.is_authenticated %}
     <li><a href="{% url 'user_auth:delete' user.username %}">退会</a></li>
{% endif %}

これで、ログインしている時のみアクセスできるようになりました!

何かありましたら、じぇい👨‍💻 (@jyouj__) | Twitterに!