質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

2163閲覧

【Django】ログインユーザーとモデルの紐付け方法

setuna0531

総合スコア128

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

0クリップ

投稿2020/09/01 00:52

編集2020/09/02 01:07

前提・実現したいこと

現在、商品登録画面(階層登録)を作成しています。
カテゴリーを作成し、その中に商品名を登録する形です。

ログインユーザーごとにshop_idなどを振り分けて、
それに合致したモデルをテンプレートで表示したいと考えています。

発生している問題・エラーメッセージ

/adminよりカテゴリーを登録すると、一覧に表示するというところまでは実現できています。
カテゴリー作成ボタンも実装しており、現在入力可能な項目は「ショップ名、並び順、カテゴリ名」の
3つを入力することで一覧にその情報を表示する形をしています。

ログインユーザーを識別し、ショップ名を自動で入れることが出来ず困っています。
※ショップ登録時にログインユーザーを設定はしています。(models参照)

該当のソースコード

models

1# 店舗情報 ログイン情報 2class Shop(models.Model): 3 user = models.ForeignKey( 4 settings.AUTH_USER_MODEL, verbose_name='ログインユーザー', on_delete=models.CASCADE 5 ) 6 company = models.CharField(max_length=100, verbose_name='会社名') 7 shop = models.CharField (max_length=100, verbose_name='店舗名') #店舗名 8 updated_at = models.DateTimeField(auto_now= True) 9 created_at = models.DateTimeField(auto_now_add= True) 10 11 def __str__(self): 12 return f'{self.company} - {self.shop}' 13 14 15class Category(models.Model): 16 shopname = models.ForeignKey(Shop, verbose_name='店舗名', on_delete=models.CASCADE) 17 order = models.IntegerField(blank=False) 18 categoryname = models.CharField(max_length=26, blank=False) 19 createtime = models.DateTimeField('作成日', auto_now_add= True) 20 updatetime = models.DateTimeField('更新日', auto_now= True) 21 22 def __str__(self): 23 return f'{self.categoryname}'

urls

1from django.urls import path 2from . import views 3 4urlpatterns = [ 5 path('list/', views.Cate_List.as_view(), name='cate_list'), 6 path('list/create/', views.Cate_Create.as_view(), name='cate_create') 7 ]

views

1class Cate_Create(generic.CreateView): 2 template_name = 'cate_create.html' 3 model = Category 4 fields = ('shopname', 'order', 'categoryname') #shopnameにて手入力できる状況になっています。これをログインユーザーで判断し自動にしたいです。 5 success_url = reverse_lazy('cate_list') 6 7 def get_context_data(self, **kwargs): 8 context = super().get_context_data(**kwargs) 9 return context

html

1{% extends 'base.html' %} 2 3{% block content %} 4<body style="background-color:paleturquoise"> 5<form action="" method="POST" enctype="multipart/form-data" class="ml-1">{% csrf_token %} 6 <p>ショップ:{{ form.shopname }}</p> #ログインユーザーで登録したshopが自動で入るようにしたい 7 <p>並び順:{{ form.order }}</p> 8 <p>カテゴリ名:{{ form.categoryname }}</p> 9 <input class="btn btn-primary" type="submit" value="保存"> 10 <a class="btn btn-secondary" href="{% url 'cate_list' %}">cancel</a> 11</form> 12</body> 13{% endblock content %}

試したこと

urlに引数などを渡すことで実現可能かと考えましたが、
shop_idや、shop_pkなど、いろんな引数で試しましたがうまくいきませんでした。
そもそもが間違っている可能性は大いにあります...。

ログインユーザーごとで識別することが出来るのか教えていただけますと幸いです。

#追記
ログインユーザーが作成したカテゴリーや商品をログインユーザーのみ
見ることが出来るようにしたいというのが本題の意味です。

どのように実装できるのかが検討もつかないのでご教授お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

絞り込みが必要なモデルに対して

models

1user = models.ForeignKey(get_user_model(), verbose_name='ログインユーザー', on_delete=models.CASCADE)

を追加しました。

Viewsにて

views

1 def form_valid(self, form): 2 qryset = form.save(commit=False) 3 qryset.user=self.request.user 4 qryset.save() 5 return super(戻り先, self).form_valid(form)

とすることで自動的に絞込対象のモデルにログインユーザー情報を埋め込めました。

あとは、情報を表示する場所で

views

1Model.objects.filter(user=self.request.user)

とすることでログインしているユーザーとそのモデルデータを作った人が
一致したものの表示が可能になりました。

投稿2020/09/02 06:26

setuna0531

総合スコア128

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問