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

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

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

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Python

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

Q&A

解決済

1回答

4848閲覧

【Django, Python】AttributeErrorが解決できない

hide_py

総合スコア1

Django

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

SNS

SNS(ソーシャル・ネットワーキング・サービス)は、 人と人とのつながりを促進したり、サポートしたりすることが可能なコミュニティ型のWebサービスです。

Python

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

0グッド

0クリップ

投稿2021/08/04 07:38

編集2021/08/04 10:49

前提・実現したいこと

Djangoを使ってSNSのようなものを作っています。
機能としては
様々なユーザーが投稿を行う→自分以外のユーザーの投稿をランダムに表示し、返信
という機能を実装しようとしています。
トップページから返信ページへ移行する際に、自分以外のユーザーの投稿をランダムに表示するための処理をしようと思っています。

該当のソースコード

作成した処理としては、
mypost = Post.objects.exclude(sender=self.request.user).order_by("?").first() →自分以外のユーザーの投稿をランダムに1つ取得
self.myid = mypost.id →取得した投稿のIDを得る

context["page"] = self.myid  →htmlファイルで {{page}}で値を受け取り、ランダムな投稿の返信ページへ遷移

なのですが、、、

Python

1#views.py 2 3class Top(generic.TemplateView): 4 template_name = 'register/top.html' 5 6 def __init__(self): 7 mypost = Post.objects.exclude(sender=self.request.user).order_by("?").first() 8 self.myid = mypost.id 9 10 def get_context_data(self, **kwargs): 11 context = super().get_context_data(**kwargs) 12 context["page"] = self.myid  13 return context 14 15class PostView(generic.CreateView): 16 model = Post 17 form_class = PostForm 18 success_url = reverse_lazy('register:top') 19 def form_valid(self, form): 20 form.instance.sender = self.request.user 21 return super().form_valid(form) 22

Python

1#forms.py 2 3classPostForm(forms.ModelForm): 4 5 class Meta: 6 model = Post 7 fields = ('text',) 8 widgets = {'text' : forms.Textarea(attrs={ 9 'rows': '10', 10 'cols': '80', 11 'maxlength': '200', 12 }), 13 } 14

Python

1#models.py 2class Post(models.Model): 3 sender = models.ForeignKey(User, on_delete=models.CASCADE) 4 text = models.TextField('Post', max_length=200) 5 send_date = models.DateTimeField('senddate', default=timezone.now)

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

以下のようなAttributeErrorが発生しています。これを解決する方法をご教示いただけないでしょうか。

File "/Users/{ソースコードへのパス}/register/views.py", line 38, in __init__ mypost = Post.objects.exclude(sender=self.request.user).order_by("?").first() AttributeError: 'Top' object has no attribute 'request'

試したこと

views.pyの

def __init__(self)

の部分を以下のようにdef get_queryset(self)に変更してもエラーが出ています。

python

1#views.py 2def get_queryset(self): 3 mypost = Post.objects.exclude(sender=self.request.user).order_by("?").first() 4 self.myid = mypost.id 5 return mypost

エラー

File "/Users/{ソースコードへのパス}/register/views.py", line 52, in get_context_data context["page"] = self.myid AttributeError: 'Top' object has no attribute 'myid'

補足情報(バージョンなど)

python 3.6.8
django 3.2.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

File "/Users/{ソースコードへのパス}/register/views.py", line 38, in __init__ mypost = Post.objects.exclude(sender=self.request.user).order_by("?").first() AttributeError: 'Top' object has no attribute 'request'

まずこのエラーはdef __init__(self):ではself.requestの属性は定義されていない状態のためエラーが起きています。
TemplateViewのメソッドフローは以下
init
setup()←ここでself.requestが定義される
dispatch()
http_method_not_allowed()
get_context_data()

File "/Users/{ソースコードへのパス}/register/views.py", line 52, in get_context_data context["page"] = self.myid AttributeError: 'Top' object has no attribute 'myid'

次にこのエラーはself.myidの属性は定義されていない状態のためエラーが起きています。

ので

python

1#views.py 2 3class Top(generic.TemplateView): 4 template_name = 'register/top.html' 5 6 def get_context_data(self, **kwargs): 7 context = super().get_context_data(**kwargs) 8                mypost = Post.objects.exclude(sender=self.request.user).order_by("?").first() 9 context["page"] = mypost.myid  10 return context

投稿2021/08/04 17:07

holy_

総合スコア364

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

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

hide_py

2021/08/05 00:43

ご回答ありがとうございます。 いただいた回答を以下のように少し変更して、エラーは解消できました。 ```python #views.py class Top(generic.TemplateView): template_name = 'register/top.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs)                 mypost = Post.objects.exclude(sender=self.request.user).order_by("?").first() myid = mypost.id context["page"] = myid  return context ``` ちなみに、連続した質問で恐縮ですが、上記のTopクラスのmyidというインスタンス変数を、 Createビューを継承した他のクラス(CommentView)内のインスタンス関数(def get_context_data)内で参照するにはどうしたらよいでしょうか? ```python class CommentView(generic.CreateView): model = Comment form_class = CommentForm top = Top() def get_context_data(self, **kwargs): num = top.myid ``` 今はこのようなコードを作ってみたのですが、「num=top.myid」の部分で「NameError: name 'top' is not defined」というエラーが出てしまい、うまくいきません。。。
hide_py

2021/08/05 03:14

すみません、追加の質問については自己解決できました。 ご回答ありがとうございました。大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問