{"id":516,"date":"2021-04-29T09:55:24","date_gmt":"2021-04-29T00:55:24","guid":{"rendered":"http:\/\/www.agile-software.site\/?p=516"},"modified":"2022-05-14T13:35:28","modified_gmt":"2022-05-14T04:35:28","slug":"django%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc","status":"publish","type":"post","link":"https:\/\/agile-software.net\/?p=516","title":{"rendered":"Django\u30ab\u30b9\u30bf\u30e0\u30e6\u30fc\u30b6\u30fc\u4f1a\u54e1\u30b5\u30a4\u30c8\u3092\u4f5c\u308b(django-allauth)"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u8a8d\u8a3c\u306e\u4ed5\u7d44\u307f<\/h2>\n\n\n\n<p>\u30bb\u30c3\u30b7\u30e7\u30f3\u8a8d\u8a3c(Cookie\u8a8d\u8a3c)\u3092\u5229\u7528\u3057\u305f\u30ed\u30b0\u30a4\u30f3\u306f<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>\u30e6\u30fc\u30b6\u30fc\u540d\u30fb\u30d1\u30b9\u30ef\u30fc\u30c9\u3068\u4e8b\u524d\u306b\u767b\u9332\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u30c6\u30fc\u30d6\u30eb\u306e\u30e6\u30fc\u30b6\u30fc\u540d\u30fb\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u672c\u4eba\u78ba\u8a8d\u3092\u884c\u3046<\/li><li>\u672c\u4eba\u78ba\u8a8d\u5f8c\u3001\u30ed\u30b0\u30a4\u30f3\u60c5\u5831\u3092\u30bb\u30c3\u30b7\u30e7\u30f3\u306b\u4fdd\u5b58\u3057\u30ad\u30fc\u3068\u306a\u308b\u30bb\u30c3\u30b7\u30e7\u30f3ID\u3092\u767a\u884c\u3059\u308b<\/li><li>\u3053\u306e\u30bb\u30c3\u30b7\u30e7\u30f3ID\u306f\u30ec\u30b9\u30dd\u30f3\u30b9\u3067\u30d6\u30e9\u30a6\u30b6\u306b\u8fd4\u3055\u308c\u3001\u30d6\u30e9\u30a6\u30b6\u5074\u306e\u300cCookie\u300d\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002<\/li><li>\u518d\u3073\u30ed\u30b0\u30a4\u30f3\u3059\u308b\u969b\u306b\u30bb\u30c3\u30b7\u30e7\u30f3ID\u304c\u9001\u4fe1\u3055\u308c\u308b\u3053\u3068\u306b\u306a\u308b\u305f\u3081\u672c\u4eba\u78ba\u8a8d\u3092\u884c\u3046\u5fc5\u8981\u304c\u306a\u304f\u306a\u308a\u307e\u3059\u3002<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">GitHub\u3068\u306e\u9023\u643a<\/h2>\n\n\n\nhttp:\/\/www.agile-software.site\/2021\/04\/24\/vs-code%e3%81%ae%e8%a8%ad%e5%ae%9a\/\n\n\n\n<h2 class=\"wp-block-heading\">\u4eee\u60f3\u74b0\u5883\u4f5c\u6210\u30fb\u5b9f\u884c<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>python3 -m venv myvenv<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>source myvenv\/bin\/activate<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">requirements.txt\u4f5c\u6210<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>Django~=3.1.4\nPillow~=8.1.0\ndjango-widget-tweaks~=1.4.8\nstripe~=2.27.0\nPillow~=8.1.0<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>(myvenv) ~$ pip3 install -r requirements.txt<\/code><\/pre><\/div>\n\n\n\n<p><strong>\u3059\u3067\u306b\u3042\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u308b\u5834\u5408\u306f\u4ee5\u4e0b\u306e\u5de5\u7a0b\u3092\u7701\u7565\u3067\u304d\u307e\u3059\u3002<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>(myvenv) ~$ django-admin startproject mysite .<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u4f5c\u6210<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>(myvenv) ~$ python3 manage.py startapp app\n(myvenv) ~$ python3 manage.py startapp accounts<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">settings.py<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>django.contrib.admin\uff1a\u7ba1\u7406\uff08admin\uff09\u30b5\u30a4\u30c8<\/li><li>django.contrib.auth\uff1a\u8a8d\u8a3c\u30b7\u30b9\u30c6\u30e0<\/li><li>django.contrib.contenttypes\uff1a\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30a4\u30d7\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af<\/li><li>django.contrib.sessions\uff1a\u30bb\u30c3\u30b7\u30e7\u30f3\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af<\/li><li>django.contrib.messages\uff1a\u30e1\u30c3\u30bb\u30fc\u30b8\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af<\/li><li>django.contrib.staticfiles\uff1a\u9759\u7684\u30d5\u30a1\u30a4\u30eb\u306e\u7ba1\u7406\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af<\/li><li>widget_tweaks:<\/li><li>app:\u4f5c\u6210\u3057\u305fapp\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u767b\u9332<\/li><li>accounts:\u4f5c\u6210\u3057\u305faccounts\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u767b\u9332<\/li><li>django.contrib.sites:\u4e0b\u8a18\u89e3\u8aac\u3042\u308a<\/li><li>allauth:<\/li><li>allauth.account:<\/li><li>allauth.socialaccount:\u30bd\u30fc\u30b7\u30e3\u30eb\u30ed\u30b0\u30a4\u30f3\u6a5f\u80fd\u3092\u5b9f\u88c5<\/li><\/ul>\n\n\n\n<div class=\"wp-block-jin-gb-block-box-with-headline kaisetsu-box1\"><div class=\"kaisetsu-box1-title\">django.contrib.sites<\/div>\n<ul class=\"wp-block-list\"><li>Django\u306b\u4ed8\u5c5e\u3059\u308bsites\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u5c0e\u5165\u3059\u308b\u3068\u30011\u3064\u306e\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8\u306b1\u3064\u306eSite\u30c7\u30fc\u30bf\u304c\u5272\u308a\u5f53\u3066\u3089\u308c\u307e\u3059\u3002\u3053\u308c\u3068OneToOne\u3067\u7d10\u3065\u304fSiteDetail\u306e\u3088\u3046\u306a\u30e2\u30c7\u30eb\u3092\u4f5c\u308b\u3053\u3068\u3067\u3001\u305d\u306e\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8\u5168\u4f53\u306e\u8a2d\u5b9a\u3092\u8868\u3059\u30e2\u30c7\u30eb\u304c\u4f5c\u308c\u308b\u3089\u3057\u3044\u3067\u3059\u3002<\/li><\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-jin-gb-block-box-with-headline kaisetsu-box1\"><div class=\"kaisetsu-box1-title\">allauth<\/div>\n<ul class=\"wp-block-list\"><li>django-allauth\u306fsites\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e\u5229\u7528\u304c\u5fc5\u8981<\/li><\/ul>\n<\/div>\n\n\n\n<ul class=\"wp-block-list\" id=\"block-487c60f9-c084-4918-a533-301603c2fc33\"><li>SITE_ID = 1 :sites\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u7528\u306e\u30b5\u30a4\u30c8ID<\/li><li>LOGIN_REDIRECT_URL = &#8216;\/&#8217; :\u30ed\u30b0\u30a4\u30f3\u6642\u306e\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u5148<\/li><li>ACCOUNT_LOGOUT_REDIRECT_URL = &#8216;\/&#8217; :\u30ed\u30b0\u30a2\u30a6\u30c8\u6642\u306e\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u5148<\/li><li>ACCOUNT_EMAIL_VERIFICATION = &#8216;none&#8217; :\u30e6\u30fc\u30b6\u767b\u9332\u6642\u306b\u78ba\u8a8d\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3059\u308b\u304b(none=\u9001\u4fe1\u3057\u306a\u3044, mandatory=\u9001\u4fe1\u3059\u308b)<\/li><\/ul>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"mysite\/settings.py\"><code>INSTALLED_APPS = [\n    &#39;django.contrib.admin&#39;,\n    &#39;django.contrib.auth&#39;,\n    &#39;django.contrib.contenttypes&#39;,\n    &#39;django.contrib.sessions&#39;,\n    &#39;django.contrib.messages&#39;,\n    &#39;django.contrib.staticfiles&#39;,\n    &#39;widget_tweaks&#39;, # \u8ffd\u52a0\n    &#39;app&#39;, # \u8ffd\u52a0\n    &#39;widget_tweaks&#39;, # \u8ffd\u52a0\n    &#39;app&#39;, # \u8ffd\u52a0\n    &#39;accounts&#39;, # \u8ffd\u52a0\n    &#39;django.contrib.sites&#39;, # \u8ffd\u52a0\n    &#39;allauth&#39;, # \u8ffd\u52a0\n    &#39;allauth.account&#39;, # \u8ffd\u52a0\n    &#39;allauth.socialaccount&#39; # \u8ffd\u52a0\n]\n\nLANGUAGE_CODE = &#39;ja&#39;\nTIME_ZONE = &#39;Asia\/Tokyo&#39;\n\n\nSITE_ID = 1\nLOGIN_REDIRECT_URL = &#39;\/&#39;\nACCOUNT_LOGOUT_REDIRECT_URL = &#39;\/&#39;\nACCOUNT_EMAIL_VERIFICATION = &#39;none&#39;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8URL<\/h2>\n\n\n\n<p>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306eURL\u3067\u3042\u308bapp.urls\u3068accounts.urls\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-jin-gb-block-box-with-headline kaisetsu-box5\"><div class=\"kaisetsu-box5-title\"><\/div>\n<p>urlpatterns\u306bpath(&#8216;accounts\/&#8217;,include(&#8216;django.contrib.auth.urls&#8217;))\u3092\u8ffd\u52a0\u3059\u308b\u3068\u8a8d\u8a3c\u5468\u308a\u306e\u3059\u3079\u3066\u306eURL\u30d1\u30bf\u30fc\u30f3\u304c\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002<\/p>\n<\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"mysite\/urls.py\"><code>from django.contrib import admin\nfrom django.urls import path, include\n\nurlpatterns = [\n    path(&#39;admin\/&#39;, admin.site.urls),\n    path(&#39;&#39;, include(&#39;app.urls&#39;)),\n    path(&#39;accounts\/&#39;, include(&#39;accounts.urls&#39;)),\n]<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3URL(app)<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"app\/urls.py\"><code>from django.urls import path\nfrom app import views\n\nurlpatterns = [\n    path(&#39;&#39;, views.IndexView.as_view(), name=&#39;index&#39;),\n]<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">views(app)<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"app\/views.py\"><code>from django.views.generic import TemplateView\n\n\nclass IndexView(TemplateView):\n    template_name = &quot;app\/index.html&quot;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">base.html(app)<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"templates\/app\/base.html\"><code>{% load static %}\n\n&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;ja&quot;&gt;\n\n&lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot;&gt;\n    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;\n    &lt;link rel=&quot;stylesheet&quot; href=&quot;https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.4.1\/css\/bootstrap.min.css&quot;&gt;\n    &lt;link rel=&quot;stylesheet&quot; href=&quot;{% static &#39;css\/style.css&#39; %}&quot;&gt;\n    &lt;title&gt;\u30ab\u30b9\u30bf\u30e0\u8a8d\u8a3c\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb&lt;\/title&gt;\n&lt;\/head&gt;\n\n&lt;body&gt;\n    &lt;nav class=&quot;navbar navbar-expand-lg navbar-dark bg-dark&quot;&gt;\n        &lt;div class=&quot;container&quot;&gt;\n            &lt;ul class=&quot;navbar-nav ml-auto&quot;&gt;\n                &lt;li class=&quot;nav-item&quot;&gt;\n                    &lt;a class=&quot;nav-link&quot; href=&quot;\/&quot;&gt;\u30db\u30fc\u30e0&lt;\/a&gt;\n                &lt;\/li&gt;\n            &lt;\/ul&gt;\n        &lt;\/div&gt;\n    &lt;\/nav&gt;\n\n    &lt;main&gt;\n        &lt;div class=&quot;container&quot;&gt;\n            {% block content %}\n            {% endblock %}\n        &lt;\/div&gt;\n    &lt;\/main&gt;\n\n    &lt;footer class=&quot;py-2 bg-dark&quot;&gt;\n        &lt;p class=&quot;m-0 text-center text-white&quot;&gt;Copyright \u00a9 Django Startup 2020&lt;\/p&gt;\n    &lt;\/footer&gt;\n\n    {% block extra_js %}\n    {% endblock %}\n\n&lt;\/body&gt;\n\n&lt;\/html&gt;<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">index.html(app)<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"templates\/app\/index.html\"><code>{% extends &quot;app\/base.html&quot; %}\n\n{% block content %}\n\n&lt;div class=&quot;my-5&quot;&gt;\n    &lt;h1&gt;Hello World!!&lt;\/h1&gt;\n&lt;\/div&gt;\n\n{% endblock %}<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">CSS(app)<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"static\/style.css\"><code>* {\n    margin: 0;\n    padding: 0;\n    box-sizing: border-box;\n}\n\nbody {\n    background: #F1F1F1;\n    display: flex;\n    flex-flow: column;\n    min-height: 100vh;\n}\n\nmain {\n    flex: 1;\n}<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"> \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3URL(accounts) <\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>from django.urls import path\nfrom accounts import views\n\nurlpatterns = [\n    path(&#39;profile\/&#39;, views.ProfileView.as_view(), name=&#39;profile&#39;),\n]<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u6d41\u308c<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>127.0.0.1:8000\u3092request<\/li><li>urls.py\u304cProfileview\u3092\u547c\u3073\u51fa\u3059<\/li><li>Profileview\u306e\u4e2d\u3067return render\u304c\u5b9f\u884c\u3055\u308c\u3001profile.html\u304c\u753b\u9762\u306b\u8868\u793a\u3055\u308c\u308b<\/li><li><\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u524a\u9664<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">view(accounts)<\/h2>\n\n\n\n<p>\u30ed\u30b0\u30a4\u30f3\u30fb\u30ed\u30b0\u30a2\u30a6\u30c8\u306eView\u306fDjango\u5074\u304c<code>django.contrib.auth<\/code>\u306b\u7528\u610f\u3057\u3066\u304f\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u305d\u308c\u3089\u3092<code>import<\/code>\u3057\u3066\u4f7f\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30e2\u30c7\u30eb\u3067\u4f5c\u6210\u3057\u305f<code>CustomUser<\/code>\u30af\u30e9\u30b9\u304b\u3089\u30ed\u30b0\u30a4\u30f3\u4e2d\u306e\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u3092\u53d6\u5f97<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"accounts\/views.py\"><code>user_data = CustomUser.objects.get(id=request.user.id)<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"accounts\/views.py\"><code>from django.views import View\nfrom accounts.models import CustomUser\nfrom django.shortcuts import render, redirect\n\n\nclass ProfileView(View):\n    def get(self, request, *args, **kwargs):\n        user_data = CustomUser.objects.get(id=request.user.id)\n\n        return render(request, &#39;accounts\/profile.html&#39;, {\n            &#39;user_data&#39;: user_data,\n        })<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">profile.html(accounts)<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>{% extends &quot;app\/base.html&quot; %}\n\n{% block content %}\n\n&lt;div class=&quot;card card-profile my-5 mx-auto&quot;&gt;\n    &lt;div class=&quot;card-body&quot;&gt;\n        &lt;h5 class=&quot;card-title text-center&quot;&gt;\u30d7\u30ed\u30d5\u30a3\u30fc\u30eb&lt;\/h5&gt;\n        &lt;table class=&quot;profile_table mb-4&quot;&gt;\n            &lt;tbody&gt;\n                &lt;tr&gt;\n                    &lt;th class=&quot;header&quot;&gt;\u540d\u524d&lt;\/th&gt;\n                    &lt;td class=&quot;data&quot;&gt;xxx&lt;\/td&gt;\n                &lt;\/tr&gt;\n                &lt;tr&gt;\n                    &lt;th class=&quot;header&quot;&gt;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9&lt;\/th&gt;\n                    &lt;td class=&quot;data&quot;&gt;xxx&lt;\/td&gt;\n                &lt;\/tr&gt;\n                &lt;tr&gt;\n                    &lt;th class=&quot;header&quot;&gt;\u6240\u5c5e&lt;\/th&gt;\n                    &lt;td class=&quot;data&quot;&gt;xxx&lt;\/td&gt;\n                &lt;\/tr&gt;\n                &lt;tr&gt;\n                    &lt;th class=&quot;header&quot;&gt;\u5165\u4f1a\u65e5&lt;\/th&gt;\n                    &lt;td class=&quot;data&quot;&gt;xxx&lt;\/td&gt;\n                &lt;\/tr&gt;\n            &lt;\/tbody&gt;\n        &lt;\/table&gt;\n        &lt;div class=&quot;button mx-auto&quot;&gt;\n            &lt;a class=&quot;btn btn-lg btn-warning btn-block&quot; href=&quot;&quot;&gt;\u7de8\u96c6\u3059\u308b&lt;\/a&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n\n{% endblock %}<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30ab\u30b9\u30bf\u30e0\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210<\/h2>\n\n\n\n<div class=\"wp-block-jin-gb-block-box-with-headline kaisetsu-box5\"><div class=\"kaisetsu-box5-title\">django-allauth<\/div>\n<p>django-allauth\u306f\u4ee5\u4e0b\u306e\u6a5f\u80fd\u3092\u5099\u3048\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u30e6\u30fc\u30b6\u30ed\u30b0\u30aa\u30f3\u6a5f\u80fd<\/li><li>\u30e6\u30fc\u30b6\u30ed\u30b0\u30a2\u30a6\u30c8\u6a5f\u80fd<\/li><li>\u30d1\u30b9\u30ef\u30fc\u30c9\u5909\u66f4<\/li><li>\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a<\/li><li>\u30e6\u30fc\u30b6\u767b\u9332<\/li><\/ul>\n<\/div>\n\n\n\n<p>Django\u3067\u4f1a\u54e1\u767b\u9332\u6a5f\u80fd\u3092\u4f7f\u3046\u5834\u5408\u306fUser\u30e2\u30c7\u30eb\u3092\u4f7f\u3044\u307e\u3059\u3002<br>\u3057\u304b\u3057\u3001\u5b9f\u306f<code>User<\/code>\u30e2\u30c7\u30eb\u306fproject\u306b\u3064\u304d1\u3064\u3057\u304b\u4f7f\u3048\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p><code>settings.py<\/code>\u3067\u8a2d\u5b9a\u3059\u308b<code>AUTH_USER_MODEL<\/code>\u306e\u90e8\u5206\u3092\u4ee5\u4e0b\u306e\u4f8b\u3067\u306faccounts\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u5bfe\u3057\u3066\u8a2d\u5b9a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u6a5f\u80fd<\/th><th>URL\u30d1\u30bf\u30fc\u30f3<\/th><th>\u30d3\u30e5\u30fc\/\u30d5\u30a9\u30fc\u30e0<\/th><\/tr><\/thead><tbody><tr><td>\u30ed\u30b0\u30a4\u30f3<\/td><td> \/accounts\/login\/ <\/td><td> LoginView <\/td><\/tr><tr><td>\u30ed\u30b0\u30a2\u30a6\u30c8<\/td><td> \/accounts\/ logout\/ <\/td><td> LogoutView <\/td><\/tr><tr><td>\u30d1\u30b9\u30ef\u30fc\u30c9\u5909\u66f4<\/td><td>  \/accounts\/ password_change\/ <\/td><td> PasswordChangeView <\/td><\/tr><tr><td>\u30d1\u30b9\u30ef\u30fc\u30c9\u5909\u66f4\u5b8c\u4e86<\/td><td>  \/accounts\/ password_change\/done <\/td><td>PasswordChangeDoneView<\/td><\/tr><tr><td>\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u30e1\u30fc\u30eb\u9001\u4fe1<\/td><td>  \/accounts\/ password_reset\/ <\/td><td> PasswordResetView <\/td><\/tr><tr><td>\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u30e1\u30fc\u30eb\u9001\u4fe1\u5b8c\u4e86<\/td><td>   \/accounts\/ password_reset\/done\/ <\/td><td> PasswordResetDoneView <\/td><\/tr><tr><td>\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a<\/td><td> \/accounts\/ reset\/&lt;uidb64&gt;\/&lt;token&gt;\/<\/td><td> PasswordResetConfirmView  <\/td><\/tr><tr><td>\u30d1\u30b9\u30ef\u30fc\u30c9\u518d\u8a2d\u5b9a\u5b8c\u4e86<\/td><td> \/accounts\/ reset\/done\/<\/td><td> PasswordResetCompleteView  <\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"mysite\/settings.py\"><code>AUTH_USER_MODEL = &#39;accounts.CustomUser&#39;<\/code><\/pre><\/div>\n\n\n\n<p>Django\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u306eUser\u30e2\u30c7\u30eb\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u540d\u3092\u8868\u3059<code>username<\/code>\u3068\u3044\u3046\u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u3042\u308a\u307e\u3059\u3002\u3057\u304b\u3057\u3001Web\u30a2\u30d7\u30ea\u306b\u3088\u3063\u3066\u306f\u30e6\u30fc\u30b6\u30fc\u540d\u3068\u3057\u3066\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u3082\u591a\u3044\u305f\u3081\u3001<strong>\u4eca\u56de\u306fusername\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u306a\u304f\u3057\u3001email\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u30e1\u30a4\u30f3\u306b\u6271\u3046\u30e2\u30c7\u30eb\u3092\u4f5c\u6210\u3057\u307e\u3059<\/strong>\u3002<\/p>\n\n\n\n<p>2\u3064\u306e\u65b9\u6cd5\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>django.contrib.auth.base_user.AbstractBaseUser<\/code>\u3092\u7d99\u627f\u3059\u308b<\/li><li><code>django.contrib.auth.models.AbstractUser<\/code>\u3092\u7d99\u627f\u3059\u308b<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><code>AbstractBaseUser<\/code>\u3092\u7d99\u627f\u3059\u308b<\/h4>\n\n\n\n<p><code>AbstractUser<\/code>\u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u306eUser\u30e2\u30c7\u30eb\u304c\u6301\u3063\u3066\u3044\u308b\u6a5f\u80fd\u3092\u5168\u3066\u6301\u3063\u3066\u304a\u308a\u3001<strong>\u30c7\u30d5\u30a9\u30eb\u30c8User\u306b\u5c11\u3057\u624b\u3092\u5165\u308c\u305f\u3044\u5834\u5408<\/strong>\u306b\u5411\u3044\u3066\u3044\u307e\u3059\u3002\u3088\u304f\u3084\u308b\u306e\u306f\u3001<code>email<\/code>\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u5fc5\u9808\u306b\u3057\u3066\u307f\u305f\u308a\u3001\u96fb\u8a71\u756a\u53f7\u3084\u4f4f\u6240\u3068\u3044\u3063\u305f\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u8ffd\u52a0\u3067\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><code>AbstractUser<\/code>\u3092\u7d99\u627f\u3059\u308b<\/h4>\n\n\n\n<p><code>AbstractBaseUser<\/code>\u306f\u6700\u4f4e\u9650\u306a\u6a5f\u80fd\u3060\u3051\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<code>AbstractUser<\/code>\u304c\u6301\u3063\u3066\u3044\u308b\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u5e7e\u3064\u304b\u3092\u6d88\u3057\u305f\u308a\u3001\u5927\u304d\u306a\u5909\u66f4\u304c\u5fc5\u8981\u306a\u5834\u5408\u306f\u3001\u3053\u3061\u3089\u306e\u7d99\u627f\u3092\u4f7f\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>UserManager<\/code><\/h3>\n\n\n\n<p>create_user\u306f\u30e6\u30fc\u30b6\u30fc\u306e\u65b0\u898f\u4f5c\u6210\u6642\u306b\u547c\u3073\u51fa\u3055\u308c\u308b\u30e1\u30bd\u30c3\u30c9\u3002<br>create_superuser\u306f\u7ba1\u7406\u8005\u7528\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u4f5c\u6210\u3059\u308b\u3068\u304d\u306b\u4f7f\u308f\u308c\u308b\u30e1\u30bd\u30c3\u30c9\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"accounts\/models.py\"><code>class UserManager(UserManager):\n    def _create_user(self, email, password, **extra_fields):\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(&#39;is_staff&#39;, False)\n        extra_fields.setdefault(&#39;is_superuser&#39;, False)\n        return self._create_user(email, password, **extra_fields)\n\n    def create_superuser(self, email, password, **extra_fields):\n        extra_fields.setdefault(&#39;is_staff&#39;, True)\n        extra_fields.setdefault(&#39;is_superuser&#39;, True)\n\n        if extra_fields.get(&#39;is_staff&#39;) is not True:\n            raise ValueError(&#39;Superuser must have is_staff=True.&#39;)\n        if extra_fields.get(&#39;is_superuser&#39;) is not True:\n            raise ValueError(&#39;Superuser must have is_superuser=True.&#39;)\n\n        return self._create_user(email, password, **extra_fields)<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><code>CustomUser<\/code><\/h3>\n\n\n\n<p><code>AbstractBaseUser<\/code>\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3001\u65b0\u305f\u306b<code>CustomUser<\/code>\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"accounts\/models.py\"><code>class CustomUser(AbstractBaseUser, PermissionsMixin):\n    email = models.EmailField(&#39;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9&#39;, unique=True)\n    first_name = models.CharField((&#39;\u59d3&#39;), max_length=30)\n    last_name = models.CharField((&#39;\u540d&#39;), max_length=30)\n    department = models.CharField((&#39;\u6240\u5c5e&#39;), max_length=30, blank=True)\n    created = models.DateTimeField((&#39;\u5165\u4f1a\u65e5&#39;), default=timezone.now)\n\n    is_staff = models.BooleanField(\n        (&#39;staff status&#39;),\n        default=False,\n        help_text=(&#39;Designates whether the user can log into this admin site.&#39;),\n    )\n    is_active = models.BooleanField(\n        (&#39;active&#39;),\n        default=True,\n        help_text=(\n            &#39;Designates whether this user should be treated as active. &#39;\n            &#39;Unselect this instead of deleting accounts.&#39;\n        ),\n    )\n\n    objects = UserManager()\n\n    USERNAME_FIELD = &#39;email&#39;\n    EMAIL_FIELD = &#39;email&#39;\n    REQUIRED_FIELDS = []\n\n    class Meta:\n        verbose_name = (&#39;user&#39;)\n        verbose_name_plural = (&#39;users&#39;)\n\n    def clean(self):\n        super().clean()\n        self.email = self.__class__.objects.normalize_email(self.email)<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"accounts\/models.py\"><code>from django.db import models\nfrom django.contrib.auth.base_user import AbstractBaseUser\nfrom django.contrib.auth.models import UserManager, PermissionsMixin\nfrom django.utils import timezone<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u7ba1\u7406\u753b\u9762<\/h2>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"accounts\/admin.py\"><code>from django.contrib import admin\n\nfrom .models import CustomUser\n\nadmin.site.register(CustomUser)<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"mysite\/settings.py\"><code>AUTH_USER_MODEL = &#39;accounts.CustomUser&#39;\nACCOUNT_AUTHENTICATION_METHOD = &#39;email&#39;\nACCOUNT_USER_MODEL_USERNAME_FIELD = None\nACCOUNT_EMAIL_REQUIRED = True\nACCOUNT_USERNAME_REQUIRED = False<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7<\/h2>\n\n\n\n<p>accounts\u304b\u3089views\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002<br>urlpatterns\u306b\u304a\u3044\u3066\u30e6\u30fc\u30b6\u30fc\u304b\u3089signup\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u6765\u305f\u6642SignupView\u3092\u8868\u793a\u3055\u305b\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>path(&#39;signup\/&#39;, views.SignupView.as_view(), name=&#39;account_signup&#39;),<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>from django.urls import path\nfrom accounts import views\n\nurlpatterns = [\n    path(&#39;signup\/&#39;, views.SignupView.as_view(), name=&#39;account_signup&#39;),\n    path(&#39;login\/&#39;, views.LoginView.as_view(), name=&#39;account_login&#39;),\n    path(&#39;logout\/&#39;, views.LogoutView.as_view(), name=&#39;account_logout&#39;),\n    path(&#39;profile\/&#39;, views.ProfileView.as_view(), name=&#39;profile&#39;),\n    path(&#39;profile\/edit\/&#39;, views.ProfileEditView.as_view(), name=&#39;profile_edit&#39;),\n]<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7\u306e\u30d5\u30a9\u30fc\u30e0\u3092\u4f5c\u6210<\/h3>\n\n\n\n<p>\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u3001allauth\u3067\u3059\u3067\u306b\u8a2d\u5b9a\u3057\u3066\u3042\u308b\u306e\u3067\u5fc5\u8981\u3042\u308a\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p>\u3053\u3053\u3067\u306f\u540d\u524d\u306e\u307f\u8ffd\u52a0\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7\u30dc\u30bf\u30f3\u304c\u62bc\u3055\u308c\u305f\u6642\u306bsave\u95a2\u6570\u304c\u5b9f\u884c\u3055\u308c\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<code>self.cleaned_data<\/code>\u3067\u30d5\u30a9\u30fc\u30e0\u306b\u8a18\u8f09\u3055\u308c\u305f\u5185\u5bb9\u3092\u53d6\u5f97\u3057\u3001<code>save<\/code>\u95a2\u6570\u3067\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4fdd\u5b58\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>    def save(self, request):\n        user = super(SignupUserForm, self).save(request)\n        user.first_name = self.cleaned_data[&#39;first_name&#39;]\n        user.last_name = self.cleaned_data[&#39;last_name&#39;]\n        user.save()\n        return user<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\"><code>from django import forms\nfrom allauth.account.forms import SignupForm # \u8ffd\u52a0\n\n\nclass SignupUserForm(SignupForm):\n    first_name = forms.CharField(max_length=30, label=&#39;\u59d3&#39;)\n    last_name = forms.CharField(max_length=30, label=&#39;\u540d&#39;)\n\n    def save(self, request):\n        user = super(SignupUserForm, self).save(request)\n        user.first_name = self.cleaned_data[&#39;first_name&#39;]\n        user.last_name = self.cleaned_data[&#39;last_name&#39;]\n        user.save()\n        return user<\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"810\" height=\"493\" src=\"http:\/\/www.agile-software.site\/wp-content\/uploads\/2021\/05\/\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7.png\" alt=\"\" class=\"wp-image-681\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">views<\/h2>\n\n\n\n<p>forms.py\u3067\u4f5c\u6210\u3057\u305fSignupUserForm\u3092from_class\u5909\u6570\u306b\u8a2d\u5b9a\u3059\u308b\u3053\u3068\u3067\u30aa\u30ea\u30b8\u30ca\u30eb\u306e\u30d5\u30a9\u30fc\u30e0\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306faccounts\/signup.html\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"accounts\/views.py\"><code>from django.views import View\nfrom accounts.models import CustomUser\nfrom accounts.forms import ProfileForm, SignupUserForm # \u8ffd\u52a0\nfrom django.shortcuts import render, redirect\nfrom allauth.account import views\n\n\nclass SignupView(views.SignupView):\n    template_name = &#39;accounts\/signup.html&#39;\n    form_class = SignupUserForm<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">signup.html<\/h3>\n\n\n\n<p>base.html\u306e\u52d5\u7684\u306a\u90e8\u5206\u306bsignup.html\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-plain\" data-file=\"accounts\/templates\/accounts\/signup.html\"><code>{% extends &quot;app\/base.html&quot; %}\n{% load widget_tweaks %}\n\n{% block content %}\n\n&lt;div class=&quot;card card-auth my-5 mx-auto&quot;&gt;\n    &lt;div class=&quot;card-body&quot;&gt;\n        &lt;h5 class=&quot;card-title text-center&quot;&gt;\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7&lt;\/h5&gt;\n        &lt;form method=&quot;post&quot; class=&quot;form-auth&quot;&gt;\n            {% csrf_token %}\n            &lt;div class=&quot;form-label-group form_wrap form_wrap-2&quot;&gt;\n                {% render_field form.first_name class=&quot;form-control&quot; placeholder=&quot;\u59d3&quot; %}\n                {% render_field form.last_name class=&quot;form-control&quot; placeholder=&quot;\u540d&quot; %}\n            &lt;\/div&gt;\n            &lt;div class=&quot;form-label-group&quot;&gt;\n                {% render_field form.email class=&quot;form-control&quot; placeholder=&quot;\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9&quot; %}\n            &lt;\/div&gt;\n            &lt;div class=&quot;form-label-group&quot;&gt;\n                {% render_field form.password1 class=&quot;form-control&quot; placeholder=&quot;\u30d1\u30b9\u30ef\u30fc\u30c9&quot; %}\n            &lt;\/div&gt;\n            &lt;div class=&quot;form-label-group&quot;&gt;\n                {% render_field form.password2 class=&quot;form-control&quot; placeholder=&quot;\u30d1\u30b9\u30ef\u30fc\u30c9(\u78ba\u8a8d)&quot; %}\n            &lt;\/div&gt;\n            &lt;div class=&quot;button mx-auto&quot;&gt;\n                &lt;button class=&quot;btn btn-lg btn-primary btn-block mx-auto&quot; type=&quot;submit&quot;&gt;\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7&lt;\/button&gt;\n            &lt;\/div&gt;\n        &lt;\/form&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n\n{% endblock %}<\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">base.html<\/h3>\n\n\n\n<p>\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u306b\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7\u3092\u8ffd\u52a0\u3057\u3001\u30ed\u30b0\u30a2\u30a6\u30c8\u6642\u306b\u8868\u793a\u3059\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8a8d\u8a3c\u306e\u4ed5\u7d44\u307f \u30bb\u30c3\u30b7\u30e7\u30f3\u8a8d\u8a3c(Cookie\u8a8d\u8a3c)\u3092\u5229\u7528\u3057\u305f\u30ed\u30b0\u30a4\u30f3\u306f \u30e6\u30fc\u30b6\u30fc\u540d\u30fb\u30d1\u30b9\u30ef\u30fc\u30c9\u3068\u4e8b\u524d\u306b\u767b\u9332\u3055\u308c\u305f\u30e6\u30fc\u30b6\u30fc\u30c6\u30fc\u30d6\u30eb\u306e\u30e6\u30fc\u30b6\u30fc\u540d\u30fb\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u672c\u4eba\u78ba\u8a8d\u3092\u884c\u3046 \u672c\u4eba\u78ba\u8a8d\u5f8c\u3001\u30ed\u30b0\u30a4\u30f3\u60c5\u5831\u3092\u30bb\u30c3\u30b7\u30e7\u30f3\u306b\u4fdd\u5b58\u3057\u30ad\u30fc\u3068\u306a<\/p>\n","protected":false},"author":1,"featured_media":1512,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jin_ogp_image_url":"","_jin_last_featured_id":0,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-516","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-django"],"_links":{"self":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts\/516","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=516"}],"version-history":[{"count":14,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts\/516\/revisions"}],"predecessor-version":[{"id":1708,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/posts\/516\/revisions\/1708"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=\/wp\/v2\/media\/1512"}],"wp:attachment":[{"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=516"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=516"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/agile-software.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}