フルスタックチャンネル
サインアップサインアップ
ログインログイン
利用規約プライバシーポリシーお問い合わせ
Copyright © All rights reserved | FullStackChannel
解決済
Django予約サイトシステム構築のカスタマイズ(顧客のログイン機能の実装)
Django
morimoli
2024/03/12 08:27

顧客のログイン機能を持たせたいのですが、どのように実装すれば良いでしょうか?
各ファイルの追加の記述、追加のファイルとその内容について、教えていただけませんか?

回答 18件
login
回答するにはログインが必要です
はる@講師
1年以上前

ご質問ありがとうございます。

アイデアとして下記はいかがでしょうか?

CustomUserモデルにuser_typeを追加します。

USER_TYPE_CHOICES = (
    ("0", "ユーザー"),
    ("1", "スタッフ"),
)

class CustomUser(AbstractBaseUser, PermissionsMixin):
  user_type = models.CharField("タイプ", max_length=30, choices=USER_TYPE_CHOICES, default="0")

サインアップ時にuser_typeを選択してサインアップすると、アカウントが区別できるかと思います。

morimoli
1年以上前

ありがとうございます。

上記の他に実装必要な作業を教えていただけませんか?

はる@講師
1年以上前

ユーザーのサインアップ時に、user_typeを0で設定して、スタッフのサインアップ時にuser_typeを1で設定します。
あとは、保存されたuser_typeを参照してユーザーとスタッフで処理を分けていけば良いかと思います。

morimoli
1年以上前

ありがとうございます。試してみます。

1
morimoli
1年以上前

丸2日考えましたが、ギブアップしました。。。。。

もし先生がよろしければ具体的な実装方法と手順やコードの具体例を教えていただけますとありがたいです。

初心者で低次元な質問になってしまい、申し訳ないです。

はる@講師
1年以上前

下記を教えて頂けますでしょうか。

・全体の具体的な機能と仕様
・実装したい部分の画面デザイン
・どこの実装部分に困っているのか

詳細を教えて頂けると、回答しやすくなります。
よろしくお願いします。

morimoli
1年以上前

今の状態ですと、顧客がログインしないでも予約をできてしまいます。そこにログイン機能を実装するのみです。
具体的には、初期画面をサインアップとスタッフログインとカスタマーログインのリンクのみにしたいと思ってます。

初心者で手順がわかっておらず申し訳ないです。

1
はる@講師
1年以上前

下記の手順はいかがでしょうか。

・スタッフとカスタマーのサインアップを分けて作成します。
・カスタマーのサインアップへのリンクは表示して、スタッフのサインアップへのリンクは見せないようにしておくとよいかと思います。
(スタッフには直接リンクを開いてもらってサインアップしてもらいます)
・この時にuser_typeを設定して、スタッフとカスタマーでユーザーのタイプを設定します。
・ログインへのリンクは1つ表示します。user_typeを参照するとスタッフかカスタマーかが分かります。
・トップページは、ログインを必須にしてあげれば、ログインしないと表示できないようにします。

views.pyにLoginRequiredMixinを追加するとログイン必須になります。

class xxxView(LoginRequiredMixin, View):
 ...

・あとは、user_typeを参照してスタッフとカスタマーで処理を分けていくことになります。

チュートリアルとは、大きく構造が異なってくるので、修正する箇所が多いですが、頑張ってください。

morimoli
1年以上前

ありがとうございます!

難しいですが試してみます。

morimoli
1年以上前

サインアップの件は大丈夫でした。。。。。

上記の件、実装に苦戦しております。またこちらにてご相談させてください!

1
morimoli
1年以上前

苦戦してまして、細かく手順とやることについて、箇条書きで作業内容を教えていただけますと嬉しいです。

初心者で申し訳ございません。

はる@講師
1年以上前

構成が異なるコードをベースにカスタマイズするのは難しいと思うので、一から構築してみてください。

  1. ユーザーとスタッフでそれぞれサインアップできる機能を追加
  2. ログイン機能を追加
  3. ログインしないとトップページに遷移できないようにする
  4. ログインしたら、ユーザーかスタッフか判断できるか確認する

まずは認識機能を構築してみてください。

morimoli
1年以上前

ありがとうございます。試してみます

morimoli
1年以上前

はるさん

お世話になっております。

CustomUserモデルにuser_typeを追加し、
トップページがカスタマーログインページ(URL : /)、
スタッフログインページ(URL : /sss/) としてページを分けて、
実装してみました。

ただ、AIエディタのCursorの言われるがままに追記や修正をしていましたが、うまくいかず現状、ログイン画面からページ遷移すらしない状況です。

もし可能でしたら、間違っている部分のご指摘と、改善案等いただけますと嬉しいです。プロジェクトは下記リンクです。

https://github.com/mori-tt/reservation_multi

atnek
1年以上前

横から失礼いたします。

同じようなシステム(スタッフアカウントと顧客アカウントを分ける)を組み、運用しておりますので、僕なりの運用方法を書かせていただきます。

  • ログイン機能はallauthを用いています
  • morimoli様が上げているgitは確認しておりませんがご了承を。

1, CustomUserオブジェクトに、"is_staff"というBooleanFieldを作成し、顧客かスタッフかを判別しています。
=> 過去レスを見る限り、morimoli様も既に似たようなフィールドを追加済みと認識しています。

2, スタッフ用のアプリ(app_staff)と、顧客用のアプリ(app_mypage)を分けて作成

3, ログインページからログイン
=> ログインページは共通ページとし、allauthのログイン処理については何もいじっていません。

# setting.pyに書いている内容です
LOGIN_URL = '/mypage/login/'
LOGIN_REDIRECT_URL = '/mypage/'

4, ログイン後に/mypage/に移動する
=> スタッフだった場合は/staff/にリダイレクトさせる
=> 顧客が/staff/にアクセスしようとした時は制限をかける


コードとしては下記のようになります

app_mypage用のviewの基本処理

class MypageBaseView(LoginRequiredMixin, View):

	def get(self, request, *args, **kwargs):
		user = self.request.user
		# ログインしたアカウントがスタッフかどうかによって分岐
		if user.is_staff:
			return redirect('app_staff:index')
		# 顧客の場合はそのままapp_mypageで処理
		return super().get(request, *args, **kwargs)

# このMypageBaseViewは顧客用アプリの全てのviewに継承しています。
# template_nameの設定や、継承先のviewにgetが無い場合等の処理云々は全て省いて書いています

app_staff用のviewの基本処理

class StaffBaseView(LoginRequiredMixin, View):

	def get(self, request, *args, **kwargs):
		user = self.request.user
		# ログインしたアカウントがスタッフかじゃない場合は404をraiseし、ページを表示させないように処理
		if not user.is_staff:
			raise Http404
		# スタッフの場合はそのままapp_staffで処理
		return super().get(request, *args, **kwargs)

# このStaffBaseViewはスタッフ用アプリの全てのviewに継承しています。
# 同じく、template_nameの設定や、継承先のviewにgetが無い場合等の処理云々は全て省いて書いています
# 顧客がスタッフページに紛れ込まないように、僕はスタッフページにip制限を掛けていますが、このサンプルにはそういった処理は省いてます。

もともとは app_mypage という一つのアプリ内で分岐を行っていましたが、View内のクラス数が多くなり分岐が大変になったので、スタッフ用アプリと顧客用アプリを完全に分けました。
その方がコードもスマートになるかと思います。

参考になりましたら幸いです。

1
morimoli
1年以上前

atnekさん

丁寧にアドバイスいただき、ありがとうございます。

参考にさせていただき作業させていただきます。

とても感謝しております。

morimoli
1年以上前

なんとかマルチログイン部分に関してはうまくいきました。。。。。。

ただ、ほとんどAIエディタのcursorに解決してもらいましたが、実装に関してなぜの理由の部分の理解が低いのが現状です。
基本的なことであれば、cursorは質問の仕方が的確であれば、正解を返してくれますね!

accout/url.py、accout/views.py、app/views.py、app/views.pyのログイン処理の部分を記述すれば大丈夫でした。

ログインタイプを分けましたが、タイプが違う場合弾くとかの処理はやっていません。loginのviewをタイプ別に違うものを使っているのでひとまず問題はないです。
要は、私のDjangoの理解が低かっただけです。。。。。

次は下記に取り組みいいポートフォリオにしていきたいと思ってます。

①サインアップからログインまで一気通貫する
②サインアップに関して、メール等で認証する
③フロントをReactで記述するか、フロントとバックを分けて、別のフレームワークのNEXT.JSで記述する

Djangoは、LaravelやRails等の他のフレームワークに比べ比べ、参考文献が少なくなかなか自分がやりたいことのコードを探すのが難しいですね。。。。英語が理解できていればもっと早く解決できる問題でもありました。

また仕事の合間等で勉強していきたいと思ってます。

また、相談させてくださいませ!

1
はる@講師
1年以上前

ご報告ありがとうございます。
うまくAIを使用して、理解を深めていけるといいですね。
お互い頑張っていきましょう。