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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

3回答

2960閲覧

【Django】ModelFormで現在ログインしているユーザー(self.request.userのように)を参照したいです。

Konbu992

総合スコア6

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2018/05/06 06:07

編集2022/01/12 10:55

前提

Django、Python初心者です。
初めて質問をさせていただきます。至らない点があるかもしれませんが、よろしくお願いいたします。

Django2.0(Python3.6)でTwitterのようなSNSを作っています。
今のところ、ユーザー登録、ログイン、ログアウト、フォロー、メッセージの送受信の機能を作成しました。

実現したいこと

メッセージを送信する時に送信相手のユーザーを、セレクトボックスで選びます。
現在は、全てのユーザーが選択肢として表示されます。
これを「フォローしているユーザーだけ」表示させたいです。

views.py

Python

1class MessageCreate(LoginRequiredMixin, generic.CreateView): 2 login_url = 'accounts/login' 3 template_name = 'mymessages/message_create.html' 4 form_class = MessageCreateForm 5 6 # 送信者の欄は自動で入れる 7 def form_valid(self, form): 8 form.instance.from_user = self.request.user 9 form.save() 10 return redirect('mymessages:message_index') 11

forms.py

Python

1class MessageCreateForm(forms.ModelForm): 2 class Meta: 3 model = Message 4 fields = ('to_user', 'subject', 'text', 'image')

試したこと

自分で調べたところ、forms.pyを以下のようにすれば良さそうなのですが、
エラーがでます。

Python

1class MessageCreateForm(forms.ModelForm): 2 class Meta: 3 model = Message 4 fields = ('subject', 'text', 'image') 5 6 to_user = forms.ChoiceField( 7 queryset=User.objects.get(user_id=self.request.user.user_id), 8 ) 9

エラー

NameError: name 'self' is not defined

self.request.userのところを、現在ログインしているユーザー(今のページを開いているユーザ)にすればできそう...だと思うのですが、どのように書けば良いでしょうか?

それとも、他に良い方法があるでしょうか?

###メッセージのmodels.py

Python

1... 2class Message(models.Model): 3 4 from_user = models.ForeignKey( 5 settings.AUTH_USER_MODEL, 6 on_delete=models.SET_NULL, 7 null=True, 8 related_name='from_user' 9 ) 10 11 to_user = models.ForeignKey( 12 settings.AUTH_USER_MODEL, 13 on_delete=models.SET_NULL, 14 null=True, 15 related_name='to_user' 16 ) 17 18 subject = models.CharField( 19 '件名', 20 max_length=50, 21 help_text='最大50文字' 22 ) 23 24 text = models.TextField( 25 '本文', 26 max_length=400, 27 help_text='最大400文字', 28 ) 29 30 image = CloudinaryField( 31 '添付画像', 32 null=True, 33 blank=True, 34 ) 35...

###フォローのmodels.py

Python

1... 2class Follow(models.Model): 3 follow_user = models.ForeignKey( 4 settings.AUTH_USER_MODEL, 5 on_delete=models.CASCADE, 6 related_name='follow_user', 7 ) 8 9 followed_user = models.ForeignKey( 10 settings.AUTH_USER_MODEL, 11 on_delete=models.CASCADE, 12 related_name='followed_user', 13 ) 14 15 follow_date = models.DateTimeField( 16 'フォローした日時', 17 auto_now_add=True, 18 ) 19 20 is_fff = models.BooleanField( 21 '相互フォロー', 22 default=False, 23 ) 24...

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

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

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

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

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

guest

回答3

0

views.pyで動的にchoicesを後から追加すればいいのではないでしょうか

forms.py

Python

1class MessageCreateForm(models.Model) 2 to_user= forms.fields.ChoiceField(label="送信相手", widget=forms.widgets.Select) 3 text = forms.CharField(label="内容", max_length=120, widget=forms.Textarea)

views.py

Python

1# 略 2 3# フォローしている人をflwに入れる 4flw = Follow.objects.filter(follow_user=request.user) 5# flwをforでitemに入れ、タプルを作る(リスト内包表記) 6form.fields['to_user'].choices = [ 7 ("----", "----") 8] + [ 9 (item.followed_user, item.followed_user) for item in flw 10] 11form = UserCreateForm()

投稿2020/03/18 03:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

views.pyで動的にchoicesを後から追加すればいいのではないでしょうか

forms.py

Python

1class MessageCreateForm(models.Model) 2 to_user= forms.fields.ChoiceField(label="送信相手", widget=forms.widgets.Select) 3 text = forms.CharField(label="内容", max_length=120, widget=forms.Textarea)

views.py

Python

1# 略 2 3# フォローしている人をflwに入れる 4flw = Follow.objects.filter(follow_user=request.user) 5# flwをforでitemに入れ、タプルを作る(リスト内包表記) 6form = UserCreateForm() 7form.fields['to_user'].choices = [ 8 ("----", "----") 9] + [ 10 (item.followed_user, item.followed_user) for item in flw 11]

投稿2020/03/18 03:44

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

Form.get_form_kwargsでself.requestを読んで__init__でchoicesを変更するとか
(choicesにcallableなオブジェクト(選択肢のタプルを返す関数)をセットしてもいいと思います)

参考

投稿2018/05/08 15:45

kokardy

総合スコア781

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問