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

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

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

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

Q&A

解決済

2回答

2578閲覧

Django エラー IntegrityError (1048, “Column 'id' cannot be null”)

Tomato_leaf

総合スコア173

Django

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

0グッド

0クリップ

投稿2021/06/01 10:51

Djangoでアプリを作っているのですが
投稿に対して投稿主にメッセージを送れるような
一種のチャットルームを作っています。(イメージとしては 「ヤフオクの出品者へ質問ボタン」 に近いような感じです。)
しかし、チャットルーム画面でメッセージを送信すると次のエラーが発生しました。

イメージ説明

イメージ説明

おそらくViews.pyの

python

1 def post(self, request, **kwargs): 2 message_room = MessageRoom.objects.filter(id=self.kwargs['pk'], 3 inquiry_user_id=self.request.user.id) 4 form = MessageForm(request.POST) 5 if form.is_valid(): 6 form.message_room_id = self.kwargs['pk'] 7 form.save() 8 else: 9 print(form.errors) 10 return redirect('hogehoge:message_room', pk=message_room[0].id)

の部分が問題になっているのかなと思っているのですが
print(form.message_room_id)をform.save()の前に挿入してみると、ターミナルに1と表示されるので
message_room_idはNUllではない気がしているのですが
何が原因でこのようなエラーがでているのか、わかりません。

models.py

class MessageRoom(models.Model): post = models.ForeignKey(Post, verbose_name='MessageRoom Post', on_delete=models.CASCADE) inquiry_user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, null=False, related_name='inquiry_user') def __str__(self): return str(self.id) class Message(models.Model): message = models.CharField(max_length=100) message_room = models.ForeignKey(MessageRoom, verbose_name='Message', on_delete=models.CASCADE) def __str__(self): return str(self.id)

Views.py

class MessageRoomView(LoginRequiredMixin, DetailView): template_name = 'hogehoge/hoge/message_room.html' model = MessageRoom form_class = MessageForm context_object_name = 'message_room' success_url = reverse_lazy('hoge:message_room') def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) message_list = Message.objects.all() context['form'] = MessageForm for message in message_list: return context def post(self, request, **kwargs): message_room = MessageRoom.objects.filter(id=self.kwargs['pk'], inquiry_user_id=self.request.user.id) form = MessageForm(request.POST) if form.is_valid(): form.message_room_id = self.kwargs['pk'] form.save() else: print(form.errors) return redirect('hogehoge:message_room', pk=message_room[0].id)

forms.py

class MessageForm(forms.ModelForm): message = forms.CharField(label='message', required=True) class Meta: model = Message fields = [ 'message', ]

message_room.html

<form action="{% url 'hogehoge:message_room' message_room.id %}" method="POST"> {% csrf_token %} {{ form.errors }} <div class="send-msg"> {{ form.message }} <button class="btn btn-warning" type="submit">Send</button> </div> </form>

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

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

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

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

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

guest

回答2

0

自己解決

ViewのPost関数を下記のようにするとうまくいきました!

def post(self, request, **kwargs): message_room = MessageRoom.objects.filter(id=self.kwargs['pk'], inquiry_user_id=self.request.user.id) form = MessageForm(request.POST) if form.is_valid(): message_obj = form.save(commit=False) message_obj.message_room_id = self.kwargs['pk'] message_obj.save() else: print(form.errors) return redirect('adopt_animals:message_room', pk=message_room[0].id)

投稿2021/06/03 07:59

Tomato_leaf

総合スコア173

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

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

0

form保存時にidを紐づけていないことが原因かと思われます。
下記でいかがでしょうか?

forms.py

python

1 class MessageForm(forms.ModelForm): 2 message_room_id = forms.ModelChoiceField(queryset= MessageRoom.objects.all(), 3 widget=forms.HiddenInput()) 4 message = forms.CharField(label='message', required=True) 5 6 class Meta: 7 model = Message 8 fields = [ 9 'message_room_id', 10 'message', 11 ] 12

投稿2021/06/01 11:13

m2l

総合スコア318

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

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

Tomato_leaf

2021/06/03 08:00

ありがとうございます。解決方法を上記に記載しました。アドヴァイスいただきありがとうございます。
m2l

2021/06/03 08:01

かしこまりました。 解決できて良かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問