縲娠yhon/Django縲代き繧ケ繧ソ繝繝ヲ繝シ繧カ縺ィ繝。繝シ繝ォ繧「繝峨Ξ繧ケ繝ュ繧ー繧、繝ウシ

django繧剃スソ縺蟋九a縺ヲ蜈ャ蠑上ョ繝√Η繝シ繝医Μ繧「繝ォ縺ェ縺ゥ荳騾壹j遒コ隱阪@邨ゅ∴縲∽シ壼藤逋サ骭イ縺ィ繝ュ繧ー繧、繝ウ讖溯ス繧貞ョ溯」縺励※縺ソ縺溘ョ縺ァ縺吶′
縺薙ョ縺セ縺セ縺ァ縺ッ菴ソ縺縺・繧峨>驛ィ蛻繧ゅ≠繧翫∵ゥ溯ス繧偵き繧ケ繧ソ繝槭う繧コ縺励※縺縺阪∪縺吶
縺溘□縲∝ャ蠑上し繧、繝医d蜷遞ョ繝悶Ο繧ー繧呈爾縺励※繧よ妙迚逧縺ェ諠蝣ア縺縺」縺溘j諠蝣ア縺悟商縺九▲縺溘j縺励※縺九↑繧願協蜉エ縺励∪縺励◆縲ら樟蝨ィ縺ョ譛譁ー繝舌シ繧ク繝ァ繝ウ縺ォ縺ヲ縲∵ァ狗ッ峨@縺ヲ縺翫j縺セ縺吶ョ縺ァ縺薙■繧峨↓霆瑚キ。繧呈紛逅縺縺溘@縺セ縺吶
Python:3.9.4
Django:3.2

Django縺ョ諠蝣ア隱ソ縺ケ縺溘>縺ョ縺ォ縲√↑縺九↑縺倶ス鍋ウサ逧縺ェ險倩ソー縺後↑縺上a縺」縺。繧闍ヲ蜉エ縺励∪縺励◆

縺ソ縺ェ縺輔s縺ョ蜿り縺ォ縺ェ繧後ーシ

縺セ縺壹ッ蜑肴署

繝ヲ繝シ繧カ

繧オ繧、繝医r蛻ゥ逕ィ縺吶k荳闊ャ繝ヲ繝シ繧カ縺ァ縺吶ゆシ壼藤逋サ骭イ縺励※縺九i繝ュ繧ー繧、繝ウ縺吶k縺薙→縺ォ繧医j縲√し繧、繝医ョ讖溯ス縺悟茜逕ィ縺ァ縺阪k繧医≧縺ォ縺ェ繧翫∪縺吶
繝ヲ繝シ繧カ縺ョ繧「繧ォ繧ヲ繝ウ繝医〒縺ッ邂。逅閠縺ォ繝ュ繧ー繧、繝ウ縺ァ縺阪∪縺帙s縲
繧「繧ォ繧ヲ繝ウ繝医ョ諠蝣ア莉・螟悶↓繧ゅ∽ス乗園縺ェ縺ゥ繧りソス蜉縺ァ逋サ骭イ縺吶k縺薙→縺悟、壹>縺ァ縺吶ゑシ井サ雁屓縺ッ縺昴%縺セ縺ァ菴懊▲縺ヲ縺翫j縺セ縺帙sシ

邂。逅閠

邂。逅閠
繧オ繧、繝医r邂。逅縺吶k縺溘a縺ョ繧「繧ォ繧ヲ繝ウ繝医〒縺吶らョ。逅逕サ髱「縺ォ繝ュ繧ー繧、繝ウ縺励※繧オ繧、繝医ョ繝。繝ウ繝繝翫Φ繧ケ繧定。後>縺セ縺吶
邂。逅閠縺ョ繧「繧ォ繧ヲ繝ウ繝医〒縺ッ縲√Θ繝シ繧カ縺ョ繝ュ繧ー繧、繝ウ逕サ髱「縺ァ縺ッ繝ュ繧ー繧、繝ウ縺ァ縺阪∪縺帙s縲

蝓コ譛ャ讖溯ス縺ァ縺ョ隱イ鬘後サ荳肴コ轤ケ

竭繝ュ繧ー繧、繝ウ縺ォ縲後Θ繝シ繧カ繝阪シ繝縲阪′蠢鬆

譛霑代ョ繧オ繧、繝医〒縺ッ繝ヲ繝シ繧カ繝阪シ繝繧剃スソ縺繧オ繧、繝医ョ譁ケ縺悟ー代↑縺縺ァ縺吶ュ縲ら炊逕ア縺ョ螟ァ驛ィ蛻縺ッ繝ヲ繝シ繧カ蛻ゥ萓ソ諤ァ縺ァ縺吶
繝ュ繧ー繧、繝ウ縺ォ繝ヲ繝シ繧カ繝阪シ繝縺悟ソ隕√↓縺ェ繧九→縲√b縺。繧阪s莨壼藤逋サ骭イ縺ョ譎ゅ↓蜈・蜉帙@縺ヲ繧ゅi縺蠢隕√′縺ゅj縺セ縺吶
莉悶↓繧ゅΓ繝シ繝ォ繧「繝峨Ξ繧ケ繧ら匳骭イ蠢鬆医→縺吶k縺ィ縲∝・蜉帙@縺ヲ繧ゅi縺鬆逶ョ縺悟「励∴縺ヲ縺励∪縺髮「閼ア縺ョ蜴溷屏縺ォ縺ェ繧翫∪縺吶
莉翫←縺阪ョ繝ュ繧ー繧、繝ウ縺ッ縲後Γ繝シ繝ォ繧「繝峨Ξ繧ケ縲阪後ヱ繧ケ繝ッ繝シ繝峨阪ョ2轤ケ縺ァ縺励g
縺昴b縺昴b繝。繝シ繝ォ繧「繝峨Ξ繧ケ繧偵o縺悶o縺門・蜉帙&縺帙★SNS繝ュ繧ー繧、繝ウ縺輔○繧九%縺ィ繧る∈謚櫁い縺ィ縺励※縺ゅj縺セ縺吶′
莉雁屓縺ッ閾ェ繧オ繧、繝医〒螳檎オ舌☆繧区婿豕輔〒讀懆ィ弱@縺セ縺吶

 

竭。邂。逅逕サ髱「縺ィ繝ヲ繝シ繧カ繝ュ繧ー繧、繝ウ縺ァ縺ョ隱崎ィシ譁ケ豕輔′荳邱

邂。逅逕サ髱「繧ゅΘ繝シ繧カ縺ョ繝ュ繧ー繧、繝ウ逕サ髱「繧ゅ√◎縺ョ縺セ縺セ菴ソ縺縺ィ繝ヲ繝シ繧カ繝阪シ繝縺ィ繝代せ繝ッ繝シ繝峨〒縺ョ繝ュ繧ー繧、繝ウ縺ォ縺ェ繧翫∪縺吶
縺昴@縺ヲ縲∬ェ崎ィシ譁ケ豕輔r螟峨∴繧医≧縺ィ縺励※繧ょ酔縺俶ゥ溯ス繧剃スソ縺」縺ヲ縺繧九◆繧
萓九∴縺ー繝ヲ繝シ繧カ縺ョ繝ュ繧ー繧、繝ウ逕サ髱「繧偵後Γ繝シ繝ォ繧「繝峨Ξ繧ケ縲阪→縲後ヱ繧ケ繝ッ繝シ繝峨阪ョ縺ソ縺ォ縺励h縺縺ィ縺励※繧
縺昴ョ縺セ縺セ縺ァ縺ッ邂。逅逕サ髱「縺ョ繝ュ繧ー繧、繝ウ譁ケ豕輔b縲後Γ繝シ繝ォ繧「繝峨Ξ繧ケ縲阪→縲後ヱ繧ケ繝ッ繝シ繝峨阪↓縺ェ縺」縺ヲ縺励∪縺縺セ縺吶
縺昴%縺ァ縲∫ョ。逅逕サ髱「縺ョ繝ュ繧ー繧、繝ウ隱崎ィシ縺ィ繝ヲ繝シ繧カ縺ョ繝ュ繧ー繧、繝ウ隱崎ィシ縺ョ讖溯ス繧貞縺代k蠢隕√′蜃コ縺ヲ縺阪∪縺吶
縺セ縺溘√ユ繝シ繝悶Ν縺ョ逋サ骭イ蜈医b荳邱偵↓縺ェ繧翫∪縺吶ョ縺ァ
admin蛹コ蛻縺ェ縺ゥ繧呈ュ」縺励¥蛻カ蠕。縺励※縺翫°縺ェ縺縺ィ縲√Θ繝シ繧カ縺ョ繧「繧ォ繧ヲ繝ウ繝医〒邂。逅逕サ髱「繝ュ繧ー繧、繝ウ縺ァ縺阪※縺励∪縺縺ィ縺縺閼蠑ア諤ァ繧貞沂繧∬セシ繧縺薙→縺ォ縺ェ繧翫∪縺吶

 

逶ョ謖縺吝ョ溯」

繝ヲ繝シ繧カ縺ィ邂。逅閠縺ォ縺、縺縺ヲ縲√%縺ョ繧医≧縺ェ螳溯」縺ォ縺励※縺縺阪∪縺吶
繧「繧ォ繧ヲ繝ウ繝 莨壼藤逋サ骭イ譎ゅョ蜈・蜉幃逶ョ 繝ュ繧ー繧、繝ウ譎ゅョ蜈・蜉幃逶ョ
繝ヲ繝シ繧カ 繝。繝シ繝ォ繧「繝峨Ξ繧ケ
繝代せ繝ッ繝シ繝
繝。繝シ繝ォ繧「繝峨Ξ繧ケ
繝代せ繝ッ繝シ繝
邂。逅閠 繝ヲ繝シ繧カ繝阪シ繝
繝。繝シ繝ォ繧「繝峨Ξ繧ケ
繝代せ繝ッ繝シ繝
繝ヲ繝シ繧カ繝阪シ繝
繝代せ繝ッ繝シ繝

繝昴う繝ウ繝

繝ヲ繝シ繧カシ壻シ壼藤逋サ骭イ繧ゅΟ繧ー繧、繝ウ繧ゅ後Γ繝シ繝ォ繧「繝峨Ξ繧ケ縲阪→縲後ヱ繧ケ繝ッ繝シ繝峨阪ョ縺ソ
邂。逅閠シ壹後Θ繝シ繧カ繝阪シ繝縲阪後Γ繝シ繝ォ繧「繝峨Ξ繧ケ縲阪後ヱ繧ケ繝ッ繝シ繝峨阪r逋サ骭イ縺励√Ο繧ー繧、繝ウ譎ゅッ縲後Θ繝シ繧カ繝阪シ繝縲阪後ヱ繧ケ繝ッ繝シ繝峨阪〒繝ュ繧ー繧、繝ウ
邂。逅閠縺ョ繝ュ繧ー繧、繝ウ縺ッ縲√そ繧ュ繝・繝ェ繝繧」隕ウ轤ケ縺ァ繝ヲ繝シ繧カ繝阪シ繝繧貞茜逕ィ縺吶k縺薙→縺ォ縺励※縺縺セ縺吶
繝。繝シ繝ォ繧「繝峨Ξ繧ケ縺ッ繝代せ繝ッ繝シ繝峨r蠢倥l縺溷エ蜷医↑縺ゥ縺ョ騾夂衍蜈医↓蛻ゥ逕ィ縺励∪縺吶
蜈ィ菴薙ョ繧、繝。繝シ繧ク縺ッ荳玖ィ倥ョ蝗ウ縺ョ騾壹j縺ァ縺吶
繝ヲ繝シ繧カ縺ィ邂。逅閠縺ョ隱崎ィシ繧貞縺代k蝣エ蜷医ョ繧ッ繝ゥ繧ケ蝗ウ
縺薙ョ繧医≧縺ォ縲∬ェ崎ィシ讖滓ァ九r蛻縺代※繝ヲ繝シ繧カ縺ィ邂。逅閠縺ァ隱崎ィシ譁ケ豕輔r蛻縺代i繧後k繧医≧縺ォ縺励∪縺吶
蟆譚・逧縺ォ繝ヲ繝シ繧カ隱崎ィシ縺ォOAuth縺ェ縺ゥ繧貞ー主・縺吶k蝣エ蜷医b謇ア縺繧縺吶¥縺ェ繧九→諤昴>縺セ縺呻シ医◆縺カ繧難シ

濶イ縲繧縺」縺ヲ繧上°縺」縺溘%縺ィ

譛ャ蠖薙ッ莉悶↓繧よー励↓縺ェ繧矩Κ蛻縺後≠繧翫√き繧ケ繧ソ繝槭う繧コ繧定ゥヲ縺ソ縺セ縺励◆縺
荳玖ィ倥ッ螳溽樟髮」譏灘コヲ鬮倥☆縺弱※隲ヲ繧√∪縺励◆縲
  1. 繝ヲ繝シ繧カ縺ィ邂。逅閠縺ョ邂。逅繝繝シ繝悶Ν繧貞縺代k
蠕瑚ソー縺ョAUTH_USER_MODEL縺ァ謖螳壹〒縺阪k繝ヲ繝シ繧カ繝「繝繝ォ縺御ク縺、縺励°縺ェ縺縺溘a縲√◎繧ゅ◎繧ゅΘ繝シ繧カ縺ィ邂。逅閠縺ョ繝「繝繝ォ繧貞縺代k譁ケ豕輔′繧上°繧峨★譁ュ蠢オ
  1. 繝ヲ繝シ繧カ縺轡B縺ォ逋サ骭イ縺吶k鬆逶ョ縺ッ繝。繝シ繝ォ繧「繝峨Ξ繧ケ縺ィ繝代せ繝ッ繝シ繝峨ョ縺ソ縺ォ縺吶k
繝ヲ繝シ繧カ縺ッusername縺ョ鬆逶ョ繧貞茜逕ィ縺励↑縺縺ョ縺ァ縺吶′縲√ユ繝シ繝悶Ν螳夂セゥ荳劾otNull蛻カ邏縺梧寺縺代i繧後※縺縺セ縺吶ゅ%縺ョ蛻カ髯舌r隗」髯、縺吶k縺ョ縺ッ螳ケ譏薙〒縺吶′縲∬ィュ螳壹r螟峨∴繧九→莉悶↓濶イ縲蠖ア髻ソ縺励◎縺縺ェ縺ョ縺ァ隲ヲ繧√∪縺励◆縲
蟇セ蠢懈婿豕輔ッ縺薙■繧峨b蠕瑚ソー

貅門y

templates

繝輔Ο繝ウ繝育判髱「逕サ髱「縺ィ縺励※譛菴朱剞貅門y縺吶k繧ゅョ
  • 莨壼藤逋サ骭イ
  • 繝ュ繧ー繧、繝ウ
  • 繝ュ繧ー繧、繝ウ蠕後ョTOP繝壹シ繧クシ域、懆ィシ逕ィシ

view

form縺九i蛟、繧貞女縺大叙繧翫∵擅莉カ縺ォ蠕薙▲縺ヲ蜃ヲ逅繧定。後>縺セ縺吶
蜃ヲ逅縺悟ョ御コ縺励◆繧液emplate縺ォ繝代Λ繝。繝シ繧ソ繧貞シ墓ク。縺鈴キ遘サ縺励∪縺吶

form

莨壼藤逋サ骭イ縺ィ繝ュ繧ー繧、繝ウ逕ィ縺ョ繝輔か繝シ繝繧呈コ門y縺励※縺縺セ縺吶
邂。逅閠縺ョ繧「繧ォ繧ヲ繝ウ繝井ス懈舌ッ繧ウ繝槭Φ繝峨Λ繧、繝ウ縺ァ螳溯。後☆繧九◆繧√∝ョ溯」縺悟ソ隕√↑縺ョ縺ッ繝ヲ繝シ繧カ逕ィ縺ョ讖溯ス縺ョ縺ソ縺ォ縺ェ繧翫∪縺吶

models

Django讓呎コ悶ョAbstractBaseUser繧堤カ呎価縺励※縲√き繧ケ繧ソ繝繝ヲ繝シ繧カ繧貞ョ夂セゥ縺励※縺縺阪∪縺吶
繧ォ繧ケ繧ソ繝繝ヲ繝シ繧カ縺ョ邯呎価縺ォ縺、縺縺ヲ縺ッ蜈ャ蠑上し繧、繝医b縺碑ヲァ縺上□縺輔>縲
蜈ャ蠑上し繧、繝

譁ー縺励¥繝励Ο繧ク繧ァ繧ッ繝医r蟋九a繧句エ蜷医ッ縲√ョ繝輔か繝ォ繝医ョツUserツ縺ァ蜊∝縺ァ縺ゅk蝣エ蜷医〒繧ゅ√き繧ケ繧ソ繝繝ヲ繝シ繧カ繝シ繝「繝繝ォ繧剃ス懈舌☆繧九%縺ィ繧貞シキ縺乗耳螂ィ縺励∪縺

縺ィ縺ョ縺薙→縺ァ縺吶ョ縺ァ縲∝ス薙し繧、繝医〒繧ゅき繧ケ繧ソ繝繝ヲ繝シ繧カ縺ョ讒狗ッ峨r謗ィ螂ィ縺励※縺縺セ縺吶

auth

繝。繝シ繝ォ繧「繝峨Ξ繧ケ隱崎ィシ逕ィ繝舌ャ繧ッ繧ィ繝ウ繝峨r螳夂セゥ縺励※縺縺セ縺吶
Django縺ョ隱崎ィシ讖溯ス縺ォ縺、縺縺ヲ縲∝ャ蠑上し繧、繝医〒荳玖ィ倥ョ騾壹j邏ケ莉九&繧後※縺縺セ縺吶

Django 縺後ョ繝輔か繝ォ繝医〒謠蝉セ帙☆繧玖ェ崎ィシ讖溯ス縺ッ縲√⊇縺ィ繧薙←縺ョ荳闊ャ逧縺ェ繧ア繝シ繧ケ縺ァ縺ッ蜊∝縺ェ繧ゅョ縺ァ縺吶′縲√ョ繝輔か繝ォ繝医〒縺ッ繝九シ繧コ縺ォ繝槭ャ繝√@縺ェ縺蝣エ蜷医b縺ゅk縺ィ諤昴>縺セ縺吶りェ蛻縺ョ繝励Ο繧ク繧ァ繧ッ繝医〒隱崎ィシ縺ョ繧ォ繧ケ繧ソ繝槭う繧コ繧定。後≧縺溘a縺ォ縺ッ縲.jango 縺梧署萓帙☆繧玖ェ崎ィシ繧キ繧ケ繝繝繧偵←縺ョ蝣エ謇縺ァ諡。蠑オ繝サ鄂ョ謠帙〒縺阪k縺九→縺縺遏・隴倥′蠢隕√〒縺吶

tests

莨壼藤逋サ骭イ縺ィ繝ュ繧ー繧、繝ウ縺ョ繝繧ケ繝医r螳夂セゥ

 

templates

繝輔Ο繝ウ繝医ョ繝繧カ繧、繝ウ縺ッbootstrap繧剃スソ縺」縺ヲ縺縺セ縺吶

縺セ縺壹ッ莨壼藤逋サ骭イ繝壹シ繧ク縺ァ縺吶
縲後Γ繝シ繝ォ繧「繝峨Ξ繧ケ縲阪後ヱ繧ケ繝ッ繝シ繝峨阪後ヱ繧ケ繝ッ繝シ繝会シ育「コ隱咲畑シ峨阪ョシ薙▽縺ョ蜈・蜉幃逶ョ繧呈コ門y縺励※縺縺セ縺吶
<body class="text-center">
<main class="form-signup">
  <form method="post">
    {% csrf_token %}
    <img class="mb-4" src="/docs/5.0/assets/brand/bootstrap-logo.svg" alt="" width="72" height="57">
    <h1 class="h3 mb-3 fw-normal">莨壼藤逋サ骭イ縺吶k</h1>
      {{ error }}
      {{ result }}
    <label>mail address</label>
    {{ form.email }}
    {{ form.email.errors }}
    <label>繝代せ繝ッ繝シ繝</label>
    {{ form.password1 }}
    {{ form.password1.errors }}
    <label>繝代せ繝ッ繝シ繝(遒コ隱)</label>
    {{ form.password2 }}
    {{ form.password2.errors }}
    <div class="checkbox mb-3">
      <label>
        <input type="checkbox" value="remember-me"> 險俶カ縺吶k
      </label>
    </div>
    <button class="w-100 btn btn-lg btn-primary" type="submit">莨壼藤逋サ骭イ</button>
    <p class="mt-5 mb-3 text-muted">© 2017-2021</p>
  </form>
</main>
</body>

谺。縺ォ繝ュ繧ー繧、繝ウ逕サ髱「縺ァ縺吶
繝ュ繧ー繧、繝ウ逕サ髱「縺ッ縲後Γ繝シ繝ォ繧「繝峨Ξ繧ケ縲阪後ヱ繧ケ繝ッ繝シ繝峨阪ョシ偵▽縺ョ蜈・蜉帷判髱「縺ォ縺ェ繧翫∪縺吶

<body class="text-center">
    
<main class="form-signin">
  <form method="post">{% csrf_token %}
    <img class="mb-4" src="/docs/5.0/assets/brand/bootstrap-logo.svg" alt="" width="72" height="57">
    <h1 class="h3 mb-3 fw-normal">繝ュ繧ー繧、繝ウ</h1>
      {{ context }}
    <label for="inputEmail" class="visually-hidden">繝。繝シ繝ォ繧「繝峨Ξ繧ケ</label>
    <input type="email" id="inputEmail" class="form-control" placeholder="繝。繝シ繝ォ繧「繝峨Ξ繧ケ" name = "email" required autofocus>
    <label for="inputPassword" class="visually-hidden">繝代せ繝ッ繝シ繝</label>
    <input type="password" id="inputPassword" class="form-control" placeholder="繝代せ繝ッ繝シ繝" name = "password" required>
    <div class="checkbox mb-3">
      <label>
        <input type="checkbox" value="remember-me"> 險俶カ縺吶k
      </label>
    </div>
    <button class="w-100 btn btn-lg btn-primary" type="submit">繝ュ繧ー繧、繝ウ</button>
    <p class="mt-5 mb-3 text-muted">© 2017-2021</p>
  </form>
</main>
</body>

譛蠕後↓繝ュ繧ー繧、繝ウ蠕後ョ繝壹シ繧ク縺ォ縺ェ繧翫∪縺吶
縺薙■繧峨ョ繝壹シ繧ク縺ッ讀懆ィシ逕ィ縺ェ縺ョ縺ァ縺ェ繧薙〒繧ゅ>縺縺ァ縺吶りィ倩シ峨@縺ヲ縺繧九b縺ョ繧Iome縺ィ陦ィ遉コ縺吶k縺ョ縺ソ縺ョ逕サ髱「縺ォ縺ェ繧翫∪縺吶

<body class="text-center">
<main>
    home
</main>
</body>

View


菴懈舌@縺殳emplate繧貞他縺ウ蜃コ縺吝ヲ逅繧定ソス蜉縺励∪縺吶
縺セ縺溘∝女縺大叙縺」縺溘ヱ繝ゥ繝。繝シ繧ソ繧堤畑縺縺ヲ莨壼藤逋サ骭イ繧繝ュ繧ー繧、繝ウ蜃ヲ逅繧貞他縺ウ蜃コ縺励∪縺吶

import uuid

from django.contrib.auth import login
from django.db import IntegrityError
from django.shortcuts import render, redirect
from django.views import View
from django.views.generic import CreateView

from user.auth import EmailAuthBackend
from user.form import SignupForm, LoginForm
from user.models import User


def home(request):
    return render(request, 'home.html', {})


class SignupView(CreateView):
    def post(self, request, *args, **kwargs):
        template_name = 'signup.html'
        form = SignupForm(data=request.POST)
        if form.is_valid():
            # 繝輔か繝シ繝縺九i'email'繧定ェュ縺ソ蜿悶k
            email = form.cleaned_data.get('email')
            # 繝輔か繝シ繝縺九i'password1'繧定ェュ縺ソ蜿悶k
            password = form.cleaned_data.get('password1')
            uuid_object = uuid.uuid1()
            username = uuid_object.hex
            try:
                user = User.objects.create_user(username=username, email=email, password=password)
                result = '逋サ骭イ縺励∪縺励◆縲'
                return render(request, template_name, {'form': form, 'result': result})
            except IntegrityError:
                error= '譌「縺ォ逋サ骭イ貂医∩縺ァ縺'
                return render(request, template_name, {'form': form, 'error': error})
        return render(request, template_name, {'form': form})

    def get(self, request, *args, **kwargs):
        template_name = 'signup.html'
        form = SignupForm(request.POST)
        return render(request, template_name, {'form': form})


class LoginView(View):
    def post(self, request, *args, **kwargs):
        template_name = 'login.html'
        success = 'home'
        form = LoginForm(data=request.POST)
        if form.is_valid():
            # 繝輔か繝シ繝縺九i'email'繧定ェュ縺ソ蜿悶k
            email = form.cleaned_data.get('email')
            # 繝輔か繝シ繝縺九i'password'繧定ェュ縺ソ蜿悶k
            password = form.cleaned_data.get('password')
            auth_object = EmailAuthBackend()
            user = auth_object.authenticate(email=email, password=password)
            if user is not None:
                #隱崎ィシ蜃ヲ逅
                login(request, user, backend='user.auth.EmailAuthBackend')
                return redirect(success)
            else:
                return render(request, template_name, {'context': '繝ュ繧ー繧、繝ウ縺ォ螟ア謨励@縺セ縺励◆'})

    def get(self, request, *args, **kwargs):
        template_name = 'login.html'
        form = LoginForm(request.POST)
        return render(request, template_name, {'context': 'get'})

繝ュ繧ー繧、繝ウ隱崎ィシ蜃ヲ逅縺ァ縺ッ縲∝セ後〒菴懈舌☆繧九蛍ser.auth.EmailAuthBackend縲阪r蜻シ縺ウ蜃コ縺励※縺縺セ縺吶
繝ヲ繝シ繧カ蛛エ縺ョ隱崎ィシ繧偵後Γ繝シ繝ォ繧「繝峨Ξ繧ケ縲阪後ヱ繧ケ繝ッ繝シ繝峨阪↓縺吶k縺溘a縺ォ
繧ォ繧ケ繧ソ繝槭う繧コ縺励◆隱崎ィシ繝舌ャ繧ッ繧ィ繝ウ繝峨r蛻ゥ逕ィ縺励∪縺吶

繝ヲ繝シ繧カ縺ョ莨壼藤逋サ骭イ譎ゅ↓username縺ッuuid繧貞・蜉帙@縺ヲ縺縺セ縺吶ゅ%繧後ッ蜈郁ソー縺ョ騾壹j縲√ユ繝シ繝悶Ν螳夂セゥ荳隔sername縺悟ソ鬆医↓縺ェ縺」縺ヲ縺縺溘jDjango縺ョ隱崎ィシ讖溯ス縺ァ蜷謇縺ォusername縺悟茜逕ィ縺輔l縺ヲ縺繧九◆繧√∽ク諢上ョ蛟、繧堤匳骭イ縺吶k縺薙→縺ォ縺励※縺縺セ縺吶

form


template縺ォ陦ィ遉コ縺吶k鬆逶ョ縺ェ縺ゥ繧貞ョ夂セゥ縺励∪縺吶
莨壼藤逋サ骭イ繝輔か繝シ繝縺ッ縲袈serCreationForm縲阪r邯呎価縺励※縺繧九◆繧√∝九縺ョ繝輔か繝シ繝縺ッ縺薙%縺ァ縺ッ螳夂セゥ縺励※縺翫j縺セ縺帙s縲
繝ュ繧ー繧、繝ウ繝輔か繝シ繝縺ョ譁ケ縺ッ縲掲orms.Form縲阪r邯呎価縺励※縺繧九ョ縺ァ縲∝ソ隕√↑繝輔ぅ繝シ繝ォ繝峨r螳夂セゥ縺励※縺縺セ縺吶

 


from django.contrib.auth import password_validation

from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.utils.translation import gettext_lazy as _

from user.models import User


class SignupForm(UserCreationForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # html縺ョ陦ィ遉コ繧貞、画峩蜿ッ閭ス縺ォ縺励∪縺

        self.fields['email'].widget.attrs['class'] = 'form-control'
        self.fields['password1'].widget.attrs['class'] = 'form-control'
        self.fields['password2'].widget.attrs['class'] = 'form-control'

    class Meta:
        model = User
        fields = ("email", "password1", "password2",)


class LoginForm(forms.Form):
    email = forms.EmailField(label='繝。繝シ繝ォ繧「繝峨Ξ繧ケ', max_length=100)
    password = forms.CharField(
        label=_("Password"),
        strip=False,
        widget=forms.PasswordInput(attrs={'autocomplete': 'new-password'}),
        help_text=password_validation.password_validators_help_text_html(),
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # html縺ョ陦ィ遉コ繧貞、画峩
        self.fields['email'].widget.attrs['class'] = 'form-control'
        self.fields['password'].widget.attrs['class'] = 'form-control'



model


譛蠕後↓model縺ォ縺ェ繧翫∪縺吶
縲窟bstractBaseUser縲阪r邯呎価縺励◆繧ォ繧ケ繧ソ繝繝ヲ繝シ繧カ縺ョ菴懈舌↓縺ェ繧翫∪縺吶

import dataclasses
from django.contrib.auth.base_user import BaseUserManager

from todo.entity.value_objects import username as vo_username
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.validators import UnicodeUsernameValidator
from django.db import models
from django.utils.translation import gettext_lazy as _


class UserManager(BaseUserManager):
    def create_user(self, username=None, password=None, email=None):
        """
        莨壼藤逋サ骭イ
        """
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            username=username,
            email=email,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None, email=None):
        """
        邂。逅閠縺ョ莨壼藤逋サ骭イ
        """
        user = self.create_user(
            username=username,
            email=email,
            password=password,
        )
        user.is_admin = True
        user.is_staff = True
        user.save(using=self._db)
        return user


@dataclasses.dataclass
class User(AbstractBaseUser, PermissionsMixin):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    username_object = vo_username.UserName;
    username = models.CharField(
        verbose_name='username',
        max_length=150,
        unique=True,
    )
    email = models.EmailField(
        verbose_name='email',
        max_length=255,
        unique=True,
    )

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    def has_perm(self, perm, obj=None):
       "Does the user have a specific permission?"
        return True

    def has_module_perms(self, app_label):
       "Does the user have permissions to view the app `app_label`?"
         return True

    def __str__(self):
        return self.username


繧ォ繧ケ繧ソ繝繝ヲ繝シ繧カ繝「繝繝ォ縺ッ蜈ャ蠑上し繧、繝縺ョ險倩ソー繧偵⊇縺シ縺昴ョ縺セ縺セ蛻ゥ逕ィ縺励※縺縺セ縺吶
逕溷ケエ譛域律縺ョ鬆逶ョ縺ッ荳崎ヲ√□縺ィ諤昴▲縺溘ョ縺ァ豸医@縺セ縺励◆縲

 


setting


繧ォ繧ケ繧ソ繝繝ヲ繝シ繧カ縺ョ蛻ゥ逕ィ縺ィ隱崎ィシ讖溯ス縺ョ霑ス蜉繧定。後▲縺ヲ縺繧九◆繧
settings.py縺ォ繧ょ推縲霑ス險倥′蠢隕√↓縺ェ繧翫∪縺吶りソス險倥☆繧九ョ縺ッ荳玖ィ倥〒縺吶

#繧ォ繧ケ繧ソ繝繝ヲ繝シ繧カ繝「繝繝ォ縺ョ謖螳
AUTH_USER_MODEL = 'user.User'

#隱崎ィシ繝舌ャ繧ッ繧ィ繝ウ繝峨ョ霑ス蜉
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'user.auth.EmailAuthBackend',
]

 


荳蠢忖rls.py繧りィ倩シ峨@縺ヲ縺翫″縺セ縺吶

from django.contrib import admin
from django.urls import path, include

from user.views import SignupView, home, listfunc, LoginView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', home, name='home'),
    path('signup/', SignupView.as_view(), name='signup'),
    path('login/', LoginView.as_view(), name='login'),
]

譛ャ遞ソ縺ァ縺ョ縺碑ェャ譏弱ッ莉・荳翫→縺ェ繧翫∪縺吶
谺。蝗槭ッ繝繧ケ繝医ョ菴懈舌r莠亥ョ壹@縺ヲ縺翫j縺セ縺吶

縺昴ョ莉悶ョ險倅コ


Python
縲娠yhon/Django縲代Ο繧ー繧、繝ウ讖溯ス繧ォ繧ケ繧ソ繝槭う繧コ
Python
Django
縲娠yhon/Django縲代き繧ケ繧ソ繝繝ヲ繝シ繧カ縺ィ繝。繝シ繝ォ繧「繝峨Ξ繧ケ繝ュ繧ー繧、繝ウシ
Python
django
Python/Django 驕ュ驕縺励◆繧ィ繝ゥ繝シ髮縺ィ隗」豎コ譁ケ豕
Django
django
Django縺ァadmin縺ォ繧ォ繧ケ繧ソ繝繝輔ぅ繝ォ繧ソ霑ス蜉

 


 



			

繧ウ繝。繝ウ繝医r谿九☆