{"id":6017,"date":"2020-10-30T00:39:20","date_gmt":"2020-10-29T15:39:20","guid":{"rendered":"http:\/\/blog.jansnap.com\/?p=6017"},"modified":"2021-12-19T20:36:07","modified_gmt":"2021-12-19T11:36:07","slug":"django-allauth%e3%81%a7%e3%80%81customuser%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e8%a4%87%e6%95%b0%e7%a8%ae%e9%a1%9e%e3%81%ae%e3%83%a6%e3%83%bc%e3%82%b6%e3%82%92%e7%ae%a1%e7%90%86%e3%81%99%e3%82%8bmulti","status":"publish","type":"post","link":"https:\/\/blog.jansnap.com\/?p=6017","title":{"rendered":"django-allauth\u3067\u3001CustomUser\u3092\u4f7f\u3063\u3066\u8907\u6570\u7a2e\u985e\u306e\u30e6\u30fc\u30b6\u3092\u7ba1\u7406\u3059\u308b(multi type user)"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%A6%82%E8%A6%81\"><\/span>\n\u6982\u8981<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Django\u3067\u3001\u8907\u6570\u306e\u30e6\u30fc\u30b6\u7a2e\u5225\u3092\u4f5c\u308c\u308b\u30b7\u30b9\u30c6\u30e0\u304c\u6b32\u3057\u3044\n\n<ul>\n<li>\u300c\u30b5\u30d7\u30e9\u30a4\u30e6\u30fc\u30b6\u300d\u300c\u30d0\u30a4\u30e4\u30fc\u30e6\u30fc\u30b6\u300d\u306e2\u7a2e\u985e\u306e\u30e6\u30fc\u30b6\u3092\u4f5c\u308c\u308b\u3088\u3046\u306b\u3059\u308b<\/li>\n<li>\u30e6\u30fc\u30b6\u7a2e\u5225\u3054\u3068\u306b\u3001\u7570\u306a\u308b\u5c5e\u6027\u3092\u6301\u305f\u305b\u308b\n\n<ul>\n<li>\u30b5\u30d7\u30e9\u30a4\u30e6\u30fc\u30b6\u306f\u4f1a\u793e\u540d\u3001\u30d0\u30a4\u30e4\u30fc\u30e6\u30fc\u30b6\u306f\u6700\u5bc4\u308a\u99c5\u3092\u767b\u9332\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li><li>\u74b0\u5883\u306f\u3001\n\n<ul>\n<li>Python 3.6.9<\/li>\n<li>Django 3.1.1<\/li>\n<li>django-allauth 0.42.0 (\u30bd\u30fc\u30b7\u30e3\u30eb\u30ed\u30b0\u30a4\u30f3\u6a5f\u80fd)<\/li>\n<\/ul>\n<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Python_Django_%E3%81%AE%E5%88%B6%E9%99%90\"><\/span>\nPython + Django \u306e\u5236\u9650<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>\u30e6\u30fc\u30b6\u8a8d\u8a3c(\u30ed\u30b0\u30a4\u30f3\u3084\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7)\u306b\u4f7f\u7528\u3067\u304d\u308b\u30e2\u30c7\u30eb\u30af\u30e9\u30b9\u306f1\u3064\u3060\u3051\n\n<ul>\n<li>settings.py\u306e <code>AUTH_USER_MODEL<\/code> \u3067\u6307\u5b9a\u3059\u308b<\/li>\n<\/ul>\n<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%AE%9F%E8%A3%85%E3%81%AE%E6%A6%82%E8%A6%81\"><\/span>\n\u5b9f\u88c5\u306e\u6982\u8981<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>CustomUser\u30e2\u30c7\u30eb\u30921\u3064\u4f5c\u308a\u3001userType\u3092\u3082\u305f\u305b\u308b<\/li><li>\u30e6\u30fc\u30b6\u7a2e\u5225\u3054\u3068\u306e\u60c5\u5831\u306f\u5225\u30c6\u30fc\u30d6\u30eb\u306b\u6301\u3061\u3001\u30ab\u30b9\u30bf\u30e0\u30e6\u30fc\u30b6\u30af\u30e9\u30b9\u3068<code>OneToOneField<\/code>\u3067\u7d10\u4ed8\u3051\u308b\n\n<ul>\n<li>UserDetailSupplier<\/li>\n<li>UserDetailBuyer<\/li>\n<\/ul>\n<\/li><li>\u30e6\u30fc\u30b6\u306e\u4fdd\u5b58\u306b\u306f\u30a2\u30c0\u30d7\u30bf\u3092\u4f7f\u3046\u3002\n\n<ul>\n<li>AccountAdapter\u3092<code>allauth.account.adapter.DefaultAccountAdapter<\/code> \u3092\u7d99\u627f\u3057\u3066\u4f5c\u6210\u3059\u308b<\/li>\n<li>\n<code>save_user<\/code>\u30e1\u30bd\u30c3\u30c9\u3092\u5b9f\u88c5\u3057\u3001\u305d\u306e\u4e2d\u3067userType\u3054\u3068\u306b\u4fdd\u5b58\u51e6\u7406\u3092\u5206\u3051\u308b<\/li>\n<li>settings.py \u306e <code>ACCOUNT_ADAPTER<\/code> \u3067\u4e0a\u8a18\u30af\u30e9\u30b9\u3092\u6307\u5b9a\u3059\u308b<\/li>\n<\/ul>\n<\/li><li>\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7\u7528\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u7a2e\u5225\u3054\u3068\u306b\u5206\u3051<del>\u308b\u304c\u3001\u9001\u4fe1\u5148\u306f1\u3064<\/del>\u3001\u9001\u4fe1\u5148\u3082\uff12\u3064\u306b\u5206\u3051\u308b\u3002\n\n<ul>\n<li>\n<code>signup<\/code>\u3068<code>signup_supplier<\/code>\u3092\u4f5c\u6210<\/li>\n<\/ul>\n<\/li><li>\u30ed\u30b0\u30a4\u30f3\u7528\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f1\u3064<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"django-allauth_%E3%81%A8%E8%87%AA%E4%BD%9C%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E9%96%A2%E4%BF%82\"><\/span>\ndjango-allauth \u3068\u81ea\u4f5c\u30af\u30e9\u30b9\u306e\u95a2\u4fc2<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>django-allauth\u306f<code>account<\/code>\u3068\u3044\u3046\u30a2\u30d7\u30ea\u540d\u3092\u4f7f\u3063\u3066\u3044\u308b\u304c\u3001\u305d\u308c\u3068\u306f\u5225\u306b<code>member<\/code>\u3068\u3044\u3046\u30a2\u30d7\u30ea\u3092\u4f5c\u308a\u3001\u305d\u3053\u3067\u5404\u7a2e\u7ba1\u7406\u3092\u884c\u3046\n\n<ul>\n<li>\u30b0\u30b0\u308b\u3068\u3001\u8907\u6570\u5f62\u306e<code>accounts<\/code>\u3068\u3044\u3046\u540d\u524d\u3067\u4f5c\u308b\u4f8b\u304c\u591a\u3044\u304c\u3001allauth\u5074\u3068\u533a\u5225\u304c\u3064\u3051\u3065\u3089\u3044\u306e\u3068\u3001\u3053\u3053\u3060\u3051\u8907\u6570\u5f62\u306b\u3057\u305f\u304f\u306a\u304b\u3063\u305f\u306e\u3067\u3001\u5225\u306a\u540d\u524d\u3092\u3064\u3051\u305f\n\n<ul>\n<li>Python\u306e\u30e1\u30f3\u30d0\u95a2\u6570\u3068\u4f3c\u3066\u3044\u308b\u304c\u3001\u30a2\u30d7\u30ea\u540d\u3060\u304b\u3089\u6df7\u540c\u3057\u306a\u3044\u3060\u308d\u3046\u3068\u3044\u3046\u8003\u3048<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%95%8F%E9%A1%8C%E7%82%B9\"><\/span>\n\u554f\u984c\u70b9<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>\n<del>\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7\u6642\u306b\u30a2\u30ab\u30a6\u30f3\u30c8\u91cd\u8907\u306a\u3069\u3067\u30a8\u30e9\u30fc\u3068\u306a\u3063\u305f\u5834\u5408\u306b\u3001\u8ffd\u52a0\u3057\u305f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u306f\u306a\u304f\u5143\u304b\u3089\u3042\u308b\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306b\u623b\u3063\u3066\u3057\u307e\u3046<\/del>\n\n<ul>\n<li>\n<del><code>signup_supplier<\/code>\u3067\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7\u3057\u3088\u3046\u3068\u3057\u3066\u5931\u6557\u3059\u308b\u3068\u3001<code>signup<\/code>\u306b\u9077\u79fb\u3057\u3066\u3057\u307e\u3046<\/del>\n\n<ul>\n<li>\u30d5\u30a9\u30fc\u30e0\u306e\u9001\u4fe1\u5148\u3092\uff12\u3064\u306b\u5206\u3051\u3066\u89e3\u6c7a\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li><li>\u8ffd\u52a0\u3057\u305f\u9805\u76ee\u3092\u30d5\u30a9\u30fc\u30e0\u304b\u3089\u53d6\u5f97\u3059\u308b\u969b\u306b <code>request.POST<\/code> \u3092\u4f7f\u3063\u3066\u3044\u308b\u304c\u3001\u3069\u3046\u306b\u304b\u306a\u3089\u306a\u3044\u304b\n\n<ul>\n<li>\n<code>form.cleaned_data.get<\/code> \u304b\u3089\u53d6\u5f97\u3057\u3088\u3046\u3068\u3057\u305f\u304c\u3001\u7a7a\u3067\u53d6\u5f97\u3067\u304d\u306a\u304b\u3063\u305f<\/li>\n<\/ul>\n<\/li><li>\u30e6\u30fc\u30b6\u60c5\u5831\u306e\u30c6\u30fc\u30d6\u30eb\u304c\u5206\u304b\u308c\u308b\u306e\u3067\u3001admin\u753b\u9762\u304c\u5206\u304b\u308a\u3065\u3089\u3044\u3002\u7ba1\u7406\u753b\u9762\u3092\u81ea\u4f5c\u3057\u305f\u307b\u3046\u304c\u3088\u3055\u305d\u3046<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%AE%9F%E8%A3%85%E3%81%AE%E5%85%B7%E4%BD%93%E4%BE%8B\"><\/span>\n\u5b9f\u88c5\u306e\u5177\u4f53\u4f8b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"django-allauth%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB\"><\/span>\ndjango-allauth\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>pip\u3067\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3001\u5404\u7a2e\u8a2d\u5b9a\u3092\u884c\u3046<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E8%A8%AD%E5%AE%9A\"><\/span>\n\u8a2d\u5b9a<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306b\u4ee5\u4e0b\u3092\u8ffd\u52a0\u3059\u308b<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># settings.py\n\n# \u8a8d\u8a3c\u306b\u4f7f\u3046\u30e2\u30c7\u30eb\u3092\u6307\u5b9a\nAUTH_USER_MODEL = 'member.CustomUser'\n# signupform\u304b\u3089\u306e\u60c5\u5831\u3092customusermodel\u306b\u4fdd\u5b58\u3059\u308b\u305f\u3081\u306e\u30a2\u30c0\u30d7\u30bf\u3092\u6307\u5b9a\nACCOUNT_ADAPTER = 'member.adapter.AccountAdapter'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%83%A2%E3%83%87%E3%83%AB%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90\"><\/span>\n\u30e2\u30c7\u30eb\u30af\u30e9\u30b9\u306e\u4f5c\u6210<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># member\/models.py\n\nfrom django.contrib.auth.models import AbstractUser\nfrom django.db import models\nfrom django.contrib.auth.models import PermissionsMixin, UserManager\n\nclass UserType(models.Model):\n    \"\"\" \u30e6\u30fc\u30b6\u7a2e\u5225 \"\"\"\n    typename = models.CharField(verbose_name='\u30e6\u30fc\u30b6\u7a2e\u5225',\n                                max_length=150)\n\n    def __str__(self):\n        return f'{self.id} - {self.typename}'\n\nUSERTYPE_SUPPLIER = 100\nUSERTYPE_BUYER = 200\nUSERTYPE_DEFAULT = USERTYPE_BUYER\n\nclass CustomUserManager(UserManager):\n    \"\"\" \u62e1\u5f35\u30e6\u30fc\u30b6\u30fc\u30e2\u30c7\u30eb\u5411\u3051\u306e\u30de\u30cd\u30fc\u30b8\u30e3\u30fc \"\"\"\n\n    def _create_user(self, email, password, **extra_fields):\n        if not email:\n            raise ValueError('The given email must be set')\n        email = self.normalize_email(email)\n        user = self.model(email=email, **extra_fields)\n        user.set_password(password)\n        user.save(using=self._db)\n        return user\n\n    def create_user(self, email, password=None, **extra_fields):\n        extra_fields.setdefault('is_staff', False)\n        extra_fields.setdefault('is_superuser', False)\n        return self._create_user(email, password, **extra_fields)\n\n    def create_superuser(self, email, password, **extra_fields):\n        extra_fields.setdefault('is_staff', True)\n        extra_fields.setdefault('is_superuser', True)\n        if extra_fields.get('is_staff') is not True:\n            raise ValueError('Superuser must have is_staff=True.')\n        if extra_fields.get('is_superuser') is not True:\n            raise ValueError('Superuser must have is_superuser=True.')\n        return self._create_user(email, password, **extra_fields)\n\n\nclass CustomUser(AbstractUser):\n    \"\"\" \u62e1\u5f35\u30e6\u30fc\u30b6\u30fc\u30e2\u30c7\u30eb \"\"\"\n\n    class Meta(object):\n        db_table = 'custom_user'\n\n    #\u4f5c\u6210\u3057\u305f\u30de\u30cd\u30fc\u30b8\u30e3\u30fc\u30af\u30e9\u30b9\u3092\u4f7f\u7528\n    objects = CustomUserManager()\n\n    # \u30e2\u30c7\u30eb\u5185\u306b\u30e6\u30fc\u30b6\u7a2e\u5225\u3092\u6301\u3064\n    userType = models.ForeignKey(UserType,\n                                verbose_name='\u30e6\u30fc\u30b6\u7a2e\u5225',\n                                null=True,\n                                blank=True,\n                                on_delete=models.PROTECT)\n    def __str__(self):\n        return self.username\n\nclass UserDetailSupplier(models.Model):\n    user = models.OneToOneField(CustomUser,\n                                unique=True,\n                                db_index=True,\n                                related_name='detail_supplier',\n                                on_delete=models.CASCADE)\n    # \u30b5\u30d7\u30e9\u30a4\u30e4\u30fc\u30e6\u30fc\u30b6\u5411\u3051\u306e\u9805\u76ee\n    companyName = models.CharField(\n                                   max_length=100,\n                                   null=True,\n                                   blank=True,\n                                )\n    def __str__(self):\n        user = CustomUser.objects.get(pk=self.user_id)\n        return f'{user.id} - {user.username} - {user.email} - {self.id} - {self.companyName}'\n\nclass UserDetailBuyer(models.Model):\n    user = models.OneToOneField(CustomUser,\n                                unique=True,\n                                db_index=True,\n                                related_name='detail_buyer',\n                                on_delete=models.CASCADE)\n    # \u30d0\u30a4\u30e4\u30fc\u30e6\u30fc\u30b6\u5411\u3051\u306e\u9805\u76ee\n    nearestStation = models.CharField(\n                                   max_length=100,\n                                   null=True,\n                                   blank=True,\n                                )\n    def __str__(self):\n        user = CustomUser.objects.get(pk=self.user_id)\n        return f'{user.id} - {user.username} - {user.email} - {self.id} - {self.nearestStation}'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%81%AE%E4%BD%9C%E6%88%90\"><\/span>\n\u30a2\u30c0\u30d7\u30bf\u306e\u4f5c\u6210<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\"># member\/adapter.py\n\nfrom allauth.account.adapter import DefaultAccountAdapter\nfrom .models import *\n\nclass AccountAdapter(DefaultAccountAdapter):\n\n    def save_user(self, request, user, form, commit=True):\n        \"\"\"\n        This is called when saving user via allauth registration.\n        We override this to set additional data on user object.\n        \"\"\"\n        # Do not persist the user yet so we pass commit=False\n        # (last argument)\n        user = super(AccountAdapter, self).save_user(request, user, form, commit=False)\n        #user.userType = form.cleaned_data.get('userType')\n        user.userType = UserType(request.POST['userType'])\n\n        if not user.userType:\n            user.userType = UserType(USERTYPE_DEFAULT) # \u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u30e6\u30fc\u30b6\u7a2e\u5225\u3092\u8a2d\u5b9a\n\n        # \u30e6\u30fc\u30b6ID\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306b\u4e00\u65e6\u4fdd\u5b58\u3059\u308b\n        user.save()\n\n        if int(user.userType.id) == USERTYPE_SUPPLIER:\n            # \u30b5\u30d7\u30e9\u30a4\u30e4\u30fc\u30e6\u30fc\u30b6\n            supplier = UserDetailSupplier()\n            supplier.user_id = user.id\n            supplier.companyName = request.POST['companyName']\n            supplier.save()\n        else:\n            # \u305d\u308c\u4ee5\u5916\u306f\u4e00\u822c\u30e6\u30fc\u30b6\n            user.userType = UserType(USERTYPE_BUYER)\n            buyer = UserDetailBuyer()\n            buyer.user_id = user.id\n            buyer.nearestStation = request.POST.get('nearestStation', False)\n            buyer.save()<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90\"><\/span>\n\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>django-allauth\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4e0a\u66f8\u304d\n\n<ul>\n<li>templates\/account\/signup.html<\/li>\n<li>templates\/account\/signup_supplier.html\n\n<ul>\n<li>form\u306bhidden\u3067\u30e6\u30fc\u30b6\u7a2e\u5225\u3092\u5165\u308c\u308b\u3002 <code><input type=\"hidden\" name=\"userType\" value=\"1\" \/><\/code>\n<\/li>\n<li>POST\u5148\u306f\u3001\u3069\u3061\u3089\u3082 <code>{% url 'account_signup' %}<\/code> \u3068\u3059\u308b<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"urlspy%E3%81%AE%E8%A8%AD%E5%AE%9A\"><\/span>\nurls.py\u306e\u8a2d\u5b9a<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>\u4ee5\u4e0b\u3092\u8ffd\u52a0<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">    path('member\/signup_supplier\/', TemplateView.as_view(template_name = 'account\/signup_supplier.html'), name='signup_supplier'),<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E3%81%9D%E3%81%AE%E4%BB%96\"><\/span>\n\u305d\u306e\u4ed6<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>admin.py\u306b\u3001\u5404\u30e2\u30c7\u30eb\u30af\u30e9\u30b9\u3092\u8ffd\u52a0\u3057\u3066\u304a\u304f<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%8F%82%E8%80%83\"><\/span>\n\u53c2\u8003<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/qiita.com\/Kei-Segawa\/items\/aa38f72fc5409a3517c6\" id=\"reference-eec7f58812e7c204b0cf\">Django\u3067django-allauth\u3068CustomUser\u3092\u4f7f\u3063\u305f\u8a8d\u8a3c\u6a5f\u80fd\u3092\u4f5c\u6210<\/a><\/li><li><p><a href=\"https:\/\/stackoverflow.com\/questions\/19085684\/how-to-create-multiple-signup-pages-with-django-allauth\" rel=\"nofollow noopener\" target=\"_blank\">How to create multiple signup pages with django-allauth?<\/a><\/p><\/li><li><p>google\u3067\u300cdjango-allauth userType\u300d\u3067\u691c\u7d22<br>\n<a href=\"https:\/\/www.google.com\/search?q=django-allauth+userType&oq=django-allauth+userType&aqs=chrome..69i57.9683j0j1&sourceid=chrome&ie=UTF-8\" class=\"autolink\" rel=\"nofollow noopener\" target=\"_blank\">https:\/\/www.google.com\/search?q=django-allauth+userType&oq=django-allauth+userType&aqs=chrome..69i57.9683j0j1&sourceid=chrome&ie=UTF-8<\/a><\/p><\/li><li><p><a href=\"https:\/\/stackoverflow.com\/questions\/44505242\/multiple-user-type-sign-up-with-django-allauth\" rel=\"nofollow noopener\" target=\"_blank\">Multiple user type sign up with django-allauth<\/a><\/p><\/li><li><p><a href=\"https:\/\/tkkm.tokyo\/post-105\/\" rel=\"nofollow noopener\" target=\"_blank\">\u3010Python\u30fbDjango\u3011AbstractUser\u30922\u56de\u4f7f\u3044\u305f\u3044\u6642\u306e\u5bfe\u51e6\u6cd5<\/a><\/p><\/li><li><p><a href=\"https:\/\/qiita.com\/d9magai\/items\/71dfa9ff95f7b70486a7\" id=\"reference-6c5c22d97d6dc723499c\">Django\u3067migrate\u6642\u306b\u4efb\u610f\u306e\u521d\u671f\u30c7\u30fc\u30bf\u3092\u81ea\u52d5\u6295\u5165\u3059\u308b<\/a><\/p><\/li><li><p><a href=\"https:\/\/www.amazon.co.jp\/dp\/B07L3DRGBT\" rel=\"nofollow noopener\" target=\"_blank\">\u73fe\u5834\u3067\u4f7f\u3048\u308b Django \u306e\u6559\u79d1\u66f8\u300a\u5b9f\u8df5\u7de8\u300b<\/a><\/p><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Django\u3067\u3001\u8907\u6570\u306e\u30e6\u30fc\u30b6\u7a2e\u5225\u3092\u4f5c\u308c\u308b\u30b7\u30b9\u30c6\u30e0\u304c\u6b32\u3057\u3044<br \/>\n\u300c\u30b5\u30d7\u30e9\u30a4\u30e6\u30fc\u30b6\u300d\u300c\u30d0\u30a4\u30e4\u30fc\u30e6\u30fc\u30b6\u300d\u306e2\u7a2e\u985e\u306e\u30e6\u30fc\u30b6\u3092\u4f5c\u308c\u308b\u3088\u3046\u306b\u3059\u308b<br \/>\n\u30e6\u30fc\u30b6\u7a2e\u5225\u3054\u3068\u306b\u3001\u7570\u306a\u308b\u5c5e\u6027\u3092\u6301\u305f\u305b\u308b<br \/>\n\u30b5\u30d7\u30e9\u30a4\u30e6\u30fc\u30b6\u306f\u4f1a\u793e\u540d\u3001\u30d0\u30a4\u30e4\u30fc\u30e6\u30fc\u30b6\u306f\u6700\u5bc4\u308a\u99c5\u3092\u767b\u9332\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4128,4106,4070,4071],"tags":[4127,4103,4066],"class_list":["post-6017","post","type-post","status-publish","format-standard","hentry","category-djando-allauth","category-django","category-python","category-python3","tag-djando-allauth","tag-django","tag-python3"],"_links":{"self":[{"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=\/wp\/v2\/posts\/6017","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6017"}],"version-history":[{"count":2,"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=\/wp\/v2\/posts\/6017\/revisions"}],"predecessor-version":[{"id":6280,"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=\/wp\/v2\/posts\/6017\/revisions\/6280"}],"wp:attachment":[{"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6017"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6017"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jansnap.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}