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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

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

Q&A

2回答

373閲覧

Xserver上だけ「'int' object has no attribute '〇〇〇'」が出る

kossy0121

総合スコア9

Django

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

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

0グッド

0クリップ

投稿2024/11/16 05:06

編集2024/11/19 02:00

前提

Python+Django+SQLiteで予約アプリを作成いたしました。
Anacondaを使ったPC上では正常に動作しているのですが、
Xserverにアップロードすると、予約画面(DBへの書き込み)で
「'int' object has no attribute '〇〇〇'」というエラーが発生します。

それぞれのバージョンは、
【PC】
Windows
Anaconda
Python 3.12.3
Django 5.1.3
Sqlite 3.45.3

【Xserver】
LinuxOS
Anaconda
Python 3.12.3
Django 5.1.3
Sqlite 3.47.0

です。
パソコン側では正常に動作しています。

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

AttributeError at /test_app/yoyaku_end/ 'int' object has no attribute 'class_date' Request Method: POST Request URL: https://test.jp/test_app/yoyaku_end/ Django Version: 5.1.3 Exception Type: AttributeError Exception Value: 'int' object has no attribute 'class_date' Exception Location: /test_app/views.py, line 160, in yoyaku_end Raised during: test_app.views.yoyaku_end Python Executable: /home/xxxxxx/anaconda3/bin/python Python Version: 3.12.3 Python Path: ['/home/xxxxxx/yamamotoweb.jp/public_html/aaa', '/home/xxxxxx/anaconda3/lib/python312.zip', '/home/xxxxxx/anaconda3/lib/python3.12', '/home/xxxxxx/anaconda3/lib/python3.12/lib-dynload', '/home/xxxxxx/anaconda3/lib/python3.12/site-packages', '/home/xxxxxx/test.jp/public_html/my_project/']

該当のソースコード

views.py

1 2#クラスリスト(予約リスト) 3@login_required 4def class_list(request): 5 global num 6 posts = ClassName.objects.all() #すべて 7 data_page = Paginator(posts, 5) # Paginatorオブジェクト生成 1ページに5件表示 8 p = request.GET.get('p') # URLのパラメータから現在のページ番号を取得 9 articles = data_page.get_page(p) # 指定のページのArticleを取得 10 return render(request, 'test_app/class_list.html', {'articles': articles}) 11 12#予約確認 13@login_required 14def yoyaku_kakunin(request,post_id,*args, **kwargs): 15 global t_bool,post 16 post = ClassName.objects.get(pk = post_id) 17 18 if request.method == "POST": 19 t_bool = request.POST["transfer"] 20 return redirect('test_app:yoyaku_end') 21 return render(request,"test_app/yoyaku_kakunin.html",{"post":post}) 22 23#予約エンド 24@login_required 25def yoyaku_end(request): 26 global t_bool,post 27 user = request.user #ログインユーザー取得 28 post_flag = 0 29 posts = ReserveList.objects.filter(username_id = user.id) 30 31 for p in posts: 32 if p.classname_id == post: 33 post_flag = 1 34 print("すでに登録済みです") 35 36 if p.classname_id.class_date == post.class_date and p.classname_id.class_start_time == post.class_start_time: 37 post_flag = 2 38 print("同じ時間に予約がありますが、予約しますか?") 39 40 if post_flag == 0: #予約する 41 ReserveList.objects.create(username_id = user.id, classname_id = post, transfer = t_bool) #ReserveList 追加 42 43 return render(request,'test_app/yoyaku_end.html',{"post_flag":post_flag}) # 呼び出す Template 44 45

models.py

1from django.db import models 2 3# Create your models here. 4class ClassNo(models.Model): 5 class_name = models.CharField('クラス名', max_length=15, blank=True, null=True) 6 class_hurigana = models.CharField('ふりがな', max_length=30, blank=True, null=True) 7 def __str__(self): 8 return self.class_name 9 10class ClassManager(models.Model): 11 class_manager = models.CharField('担当', max_length=30, blank=True, null=True) 12 manager_hurigana = models.CharField('ふりがな', max_length=30, blank=True, null=True) 13 def __str__(self): 14 return self.class_manager 15 16class ClassName(models.Model): 17 class_id = models.ForeignKey(ClassNo, on_delete=models.PROTECT, blank=True, null=True,verbose_name= ('クラス名')) 18 class_date = models.DateField('日付', max_length=15, blank=True, null=True) 19 class_start_time = models.TimeField('開始時間', max_length=15,blank=True, null=True) 20 class_end_time = models.TimeField('終了時間', max_length=15,blank=True, null=True) 21 class_manager = models.ForeignKey(ClassManager, on_delete=models.CASCADE, blank=True, null=True,verbose_name= ('担当')) 22 def __int__(self): 23 return self.class_id 24 25class UserName(models.Model): 26 user_name = models.CharField('ユーザーID', max_length=15,blank=True, null=True) 27 user_pass = models.CharField('パスワード', max_length=15,blank=True, null=True) 28 affiliation = models.CharField('所属', max_length=15,blank=True, null=True) 29 30class ReserveList(models.Model): 31 username_id = models.IntegerField('ユーザー番号', blank=True, null=True) 32 classname_id = models.ForeignKey(ClassName, on_delete=models.CASCADE, blank=True, null=True, verbose_name= ('予約クラス')) 33 transfer = models.BooleanField(verbose_name = '送迎あり') 34

試したこと

・PC側とXseverのバージョンを揃えた。
・データベースの中身を一度空にして、再度登録しなおした。

補足情報(FW/ツールのバージョンなど)

”class_date”は、開催予定教室の日付が入っています。2024-11-11といった形式です。

日付の部分のエラーなのかと思ったのですが、あまり思い当たることが見つからず、お手上げ状態です。
何卒よろしくお願いいたします。

補足情報(Xserverのエラーログの情報)

Internal Server Error: /test_app/yoyaku_end/: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ Traceback (most recent call last):: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ File "/home/xs6xxxxxx/anaconda3/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ response = get_response(request): /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ ^^^^^^^^^^^^^^^^^^^^^: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ File "/home/xs6xxxxxx/anaconda3/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ response = wrapped_callback(request, *callback_args, **callback_kwargs): /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ File "/home/xs6xxxxxx/anaconda3/lib/python3.12/site-packages/django/contrib/auth/decorators.py", line 60, in _view_wrapper: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ return view_func(request, *args, **kwargs): /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ File "/home/xs6xxxxxx/testweb.jp/public_html/xxx/test_app/views.py", line 161, in yoyaku_end: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ if p.classname_id.class_date == post.class_date and p.classname_id.class_start_time == post.class_start_time:: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ ^^^^^^^^^^^^^^^: /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/ AttributeError: 'int' object has no attribute 'class_date': /home/xs6xxxxxx/testweb.jp/public_html/xxx/index.cgi, referer: https://xxx.xxxxxx.jp/test_app/class_list/22/

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

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

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

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

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

bsdfan

2024/11/18 04:38

両者で、使っている sqlite のデータベースファイルは同じですか? foreign key 関係のなにかが両者で違っていないでしょうか?
kossy0121

2024/11/18 07:01

ありがとうございます。 ご指摘いただき、もしやと思い再度確認してきました。 しかし、やはりデータベースもPC上で作成したものをそのままアップロードしたので、中身や設定に相違はありませんでした…。 逆に、新規でデータベースを作成したり、migrateしたりという作業をを全くしていないのですが、それが関係していたりするのでしょうか…?
bsdfan

2024/11/18 13:05

modelの定義をしているコードもあったほうがいいです。 新規でmigrationやって解決しないかは試すのがいいと思います。
quickquip

2024/11/19 01:43

セキュリティ上は好ましくないですが、DEBUGをいったんTrueにして、完全なTracebackを得た方がよさそうと感じました コードもエラーも他人が想像するには全然足りてないかと (質問に載せるときはユーザ名とかIPとかだけマスクして)
kossy0121

2024/11/19 01:49

>bsdfan 様 models.pyを追記いたしました。 migrationについては、最終手段でやってみたいと思っています…。最後に試してみます。 quickquip 様 ありがとうございます、もう少し情報を取得して参ります。よろしくお願いいたします。
bsdfan

2024/11/19 05:46

yoyaku_end() の中で、class_date の属性にアクセスしているのは p.classname_id と post です。 p は ReserveList で p.classname_id は ClassName なので class_date は存在しているはず。 一方 post は global の変数で、yoyaku_kakunin() では ClassName の値が代入されていますが、それ以外の(質問文に書かれていない)ところでどうなっているかがわかりません。そこで post に int が代入されるケースが存在するのではないでしょうか。 (動作環境の違いというよりは、テストケースの違いでは?)
kossy0121

2024/11/19 06:59

bsdfan様 ありがとうございます。 仰る通りです! global post の部分ですが、 yoyaku_end()のglobal postは、 yoyaku_kakunin()の post = ClassName.objects.get(pk = post_id) のデータyoyaku_end()で使うためにglobalにしてしまっています…。(そういうつもりで使用してしまった感じです) 雑なやり方をしてしまったのですが、もしかするとその他の箇所で使用しているpostが悪さをしている感じなのでしょうか…?! (ローカルPC上ではエラーもなく動作していたので…) >(動作環境の違いというよりは、テストケースの違いでは?) また、こちらについては、以下の内容で試してみました。 views.pyの28行目~40行目は、重複予約をさせないためのエラー処理ですので、そちらの箇所をすべて削除いたしました。 すると、以下のエラーが出てきました。 >Cannot assign "1": "ReserveList.classname_id" must be a "ClassName" instance. おっしゃるように、"1"となっていたので、やはりどこかでintが紛れ込んでいるのでしょうか…。 引き続き、頑張ってみます。 大変参考になりました、ありがとうございます!
quickquip

2024/11/19 07:59

ローカルでは開発用Webサーバ (python manage.py runserver の実行)で動かしていて、XseverではwsgirefのCGIHandlerあたりでCGIから動かしているのではないでしょうか?
kossy0121

2024/11/19 13:32

quickquip様 はい!そうですそうです、おっしゃる通りです!!! すみません、本当に勉強不足で、、、なにか違いがあるのでしょうか、、、?! (printも、cgiで動かしていると表示が難しいとありました) なにか、お気づきの点があればぜひご教授いただけましたら幸いです。
quickquip

2024/11/19 15:11

とりあえず情報は質問を編集して追記した方がよいかと そうですね。**内部的な** 動きは変わります。パフォーマンスは全然違うでしょう ただ、**ちゃんと** 作法に則って書いてあれば **外見は** 同じように動くはずです
kossy0121

2024/11/20 02:24

quickquip様 大変重要な情報、ありがとうございます。そちらの方向で情報調べてみようと思います! PCローカルに頼ってちゃんと作法を守っていない表記もあるので、そちらを改善してもう一度試してみたいと思います!
guest

回答2

0

日付の部分のエラーなのかと思ったのですが、あまり思い当たることが見つからず、お手上げ状態です。

AttributeErrorと表示されていますよ。
p.classname_idまたはpostあるいはその両方にclass_date属性が存在していないのではないでしょうか?

p.classname_id == postから推測するとp.classname_idpostは数値ではありませんか?その場合'int' object has no attribute 'class_date'が発生するかと思われます。

上記でない場合は他のソースコードも掲載いただくと他に何か分かることがあるかもしれません。

投稿2024/11/16 15:08

meg_

総合スコア10716

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

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

kossy0121

2024/11/18 00:36

ありがとうございます!! AttributeErrorについて調べて見たのですが、文字列を数値に、数値を文字列になど触ってみたのですが変わりませんでした…。 最大の問題は、このエラーがPCのローカル上では表示されず、Xserver上のみで表示されているという点なんです…。(PCはWindows、レンタルサーバーはLinuxのようです) おっしゃるとおりp.classname_idは数値で、postはobject(post_id)というリレーション先のテーブルの値が入っております。 初心者すぎてきちんと説明できずに申し訳ありません。 他のソースコードも掲載してみようと思います。
meg_

2024/11/18 10:51

> 文字列を数値に、数値を文字列になど触ってみたのですが変わりませんでした…。 class_dateを属性にもつクラス(インスタンス)に対してclass_dateを呼び出さないとエラーは解消されないかと思います。 > おっしゃるとおりp.classname_idは数値 上記であるならp.classname_id.class_dateは書き間違いではありませんか?p.class_dateだったりしませんか?
kossy0121

2024/11/19 03:16 編集

>class_dateの呼び出しについて 今回のエラーとなっていた箇所は、「すでに予約がある場合のエラー処理」の箇所でしたので、エラー処理の箇所を一旦削除してみました。 すると、おっしゃっているようなインスタンスのエラーが出てきました! >Cannot assign "1": "ReserveList.classname_id" must be a "ClassName" instance. これですよね?! しかし、ClassNameのインスタンスと言われても・・・特に設定している箇所がないんです…💦 これで無事動作すればよいのですが、なぜPC上ではエラーなく動作しているのかという疑問が残ります… >p.classname_idは数値 もしや?と思い、p.class_dateに書き換えてみましたがエラーになりました… リレーション先のテーブルのclass_dateを取得している感じです。 引き続き、修正してみます。ありがとうございます!
meg_

2024/11/19 09:27

models.pyを見ました。p.classname_id.class_dateは問題ないということですね。ここで「post」という変数は何者でしょうか?global t_bool,post なのでどこかに定義があるかと思いますがどのようなオブジェクトでしょうか?
kossy0121

2024/11/20 02:37

すみません。。。多分ここが悪いんでしょうね。。。 global t_bool,postは、 yoyaku_kakunin()の、 post = ClassName.objects.get(pk = post_id) これと t_bool = request.POST["transfer"] これを、yoyaku_end()でも使いたいがために、使用しました。 この使い方そのものが間違えているんですね…きっと…
meg_

2024/11/20 12:18

「post = ClassName.objects.get(pk = post_id)」で定義されていたのですね。すみません、見逃していました。
meg_

2024/11/20 12:32

コードを見たところ、p.classname_id と post は 共にClassNameモデルでしょうか?そうであるなら「'int' object has no attribute 'class_date'」のエラーは発生しなさそうなのですが。お力になれずすみません。
guest

0

14行目に、前後のif文とインデントをそろえて、

print(type(p)) print(type(p.classname_id)) print(type(p.classname_id.class_date)) print(p.classname_id.class_date) print(type(post)) print(type(post.class_date)) print(post.class_date)

を入れてみてください。
今度は、そのprint文自体がエラーになるかもしれませんが、そうやって切り分けていきます。

投稿2024/11/16 05:30

hiroki-o

総合スコア1057

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

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

kossy0121

2024/11/18 00:31

ありがとうございます! 早速試してみたのですが、Xserver上だから?なのか、SSHの画面にprint文が表示されないみたいです…。 ここが表示されるよう、まずはXserverでエラーが表示されるように設定変えてみます…。 それにしても、エラーが出るのはサーバー上だけなのが気がかりです…。
hiroki-o

2024/11/18 13:14

- views.pyの160行目は、提示しているソースの何行目ですか - 36行目に全角の空白が入っているのは単なるコピペミスでしょうか - printは「すでに登録済みです」「同じ時間に予約がありますが、予約しますか?」も表示されないのですか - リダイレクトも無理ですか - エラーは何に出力されているのでしょうか。コンソール、ブラウザ、その他
kossy0121

2024/11/19 01:28

ありがとうございます。 - ソースコードの36行目のclass_dateになります。 - もしや!と思い確認しましたが、半角でした。コピペミスでしたすみません。 - printも表示されていません…。エラーについては、Xserver上のエラーログから見ることができました。 - リダイレクト、はどの箇所をリダイレクトしたら良いでしょうか…? - エラーはブラウザとXserverのエラーログです。コンソールには表示されていません。エラーログには、コンソールで表示されるエラーと同様の内容が残っていそうです…。 エラーログの内容を追記いたします。 ありがとうございます、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問