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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2271閲覧

django:店舗がスタッフを新規登録する時に、店舗IDを自動的に紐づけたい

hiranohirano

総合スコア33

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/12/18 08:54

前提・実現したいこと

店舗管理者が店舗スタッフを新規登録する際に、自動的に店舗IDが紐づけられるようにしたいです。

店舗管理者の登録は、djangoのデフォルトのUserモデルを使っています。
店舗管理者と店舗は、ManyToManyFieldで、
店舗とスタッフは、ForeignKeyで紐づけています。

該当のソースコード

※不要そうなところは省略してあります。
models.py

python

1from django.contrib.auth.models import User 2... 3 4class Store(models.Model): 5 name = models.CharField(verbose_name='店舗名', max_length=255) 6 user = models.ManyToManyField(User, verbose_name='店舗管理者') 7 8 9class Staff(models.Model): 10 name = models.CharField(verbose_name='名前', max_length=255) 11 store_id = models.ForeignKey( 12 Store, verbose_name='店舗ID', on_delete=models.CASCADE,)

views.py

python

1class StaffCreateView(CreateView): 2 model = Staff 3 form_class = StaffCreateForm 4 template_name = '../staff_create.html' 5 success_url = reverse_lazy('sample:index')

forms.py

python

1class StaffCreateForm(forms.ModelForm): 2 3 class Meta: 4 model = Staff 5 fields = '__all__'

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

今のままでは、スタッフ登録はできるのですが、店舗IDを自分で選ぶ仕組みになっています。
これを、自分で選択することなく、店舗IDを紐づけたいです。

fields = 'all'の部分をexclude = ['store_id']にすると、
自分で店舗IDを選ぶ必要はなくなるのですが、以下のエラーが出てしまいます。

列"store_id_id"内のNULL値はNOT NULL制約違反です

お分かりになる方がおりましたら、何卒宜しくお願い致します。

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

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

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

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

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

gh640

2018/12/18 12:34

方向性としては `StaffCreateForm` か `StaffCreateView` でベースクラスのメソッドを上書きして実現する形になると思いますが、自動的に紐付ける店舗 ID というのをどこから持ってくる形にするのかによって実装しやすい方法は変わってくるものと思います。例えばよくある形はスタッフ作成フォームの URL に店舗 ID が含まれていてそれを使う形でしょうか。そのあたりのご要望をご説明されると具体的な回答がもらえやすくなるのではないかと思います。
hiranohirano

2018/12/18 13:07

ご回答ありがとうございます。スタッフ作成フォームのURLに含まれる店舗IDを使う形で考えています。 urls.pyのurlpatternsで、新規作成のURLは下記のようにしています。 path('user/store<int:pk>/staff/create', StaffCreateView.as_view(), name='user_staff_create'),
gh640

2018/12/18 13:42

ご返信ありがとうございます。ご返信いただいた内容を受けて回答させていただきましたので、またご覧になってみください。
guest

回答1

0

ベストアンサー

ご返信ありがとうございます。

バージョンに言及されていませんが、 Python 3 / Django 2.1.x と仮定して回答させていただきますね。

urls.pyのurlpatternsで、新規作成のURLは下記のようにしています。
path('user/storeint:pk/staff/create', StaffCreateView.as_view(), name='user_staff_create'),

とのことですので、 dispatch() メソッドの引数の kwargs から URL パラメータ pk が取得できるものと思います。それを適当な名前のアトリビュート(=祖先クラスで使われていない & 将来的にも衝突の可能性の低い名前のアトリビュート)に格納しておけば後々利用できるようになります。

また、フォームの post 時にユーザの入力値が不正でなければ form_valid() というメソッドが呼ばれ、その中で新しいモデルレコードが DB に保存されるようになっています。ですので、 form_valid() を上書きして、( dispatch() であらかじめ取得しておいた) store をその中でセットするようにすると、おそらくお望みのことができるものと思います。

実装サンプルです:

python

1# (省略) 2from django.shortcuts import get_object_or_404 3 4 5class StaffCreateView(CreateView): 6 # (省略) 7 8 # URL のパラメータ `pk` から対象の `Store` を取得する 9 def dispatch(self, request, *args, **kwargs): 10 self.target_store = get_object_or_404(Store, pk=kwargs['pk']) 11 return super().dispatch(request, *args, **kwargs) 12 13 # `staff` の保存直前に URL から取得した `store` フィールドをセットする 14 def form_valid(self, form): 15 form.instance.store = self.target_store 16 return super().form_valid(form)

次のページもご参考になるものと思います:

ちなみに、このあたりを確信を持って実装するには関連するコードを読む必要があると思います。必要に応じてお読みになってみてください:

投稿2018/12/18 13:41

gh640

総合スコア1407

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

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

hiranohirano

2018/12/19 06:55

こちらのアドバイスをもとに思った通りの実装ができるようになりました!ありがとうございました!
gh640

2018/12/19 09:27

そうですか。結果をお知らせくださりありがとうございます。よかったです :)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問