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

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

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

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

Python

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

Q&A

解決済

1回答

918閲覧

Django、views.pyにおいて関数viewをTemplateViewに書き換えたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

0クリップ

投稿2020/05/06 23:45

編集2020/05/08 00:20

djnago、views.pyにおいて関数viewで記述した内容をTemplateViewに書き換えたいのですが、やり方がいまいち分かりません。

python

1def index(request, username): 2 user = get_object_or_404(User, username=username) 3 post_data = user.post_set.all() 4 5 return render(request, 'post/index.html', { 6 'user': user, 7 'post_data': post_data, 8 })

上記を関数viewをTemplateViewに書き換えたいです。

python

1class IndexView(ListView): 2 model = Post 3 template_name = 'post/index.html' 4 paginate_by = 5 5 6 # 下記を追加したが思うような挙動をしてくれませんでした。 7 def get_queryset(self): 8 user = self.request.user.id 9 return Post.objects.filter(user=user)

期待する挙動としては、リクエストユーザーでは無く、投稿したuserの投稿一覧を取得したいイメージになります。
アドバイスよろしくお願いします。

追記
model.py

python

1class Post(models.Model): 2 user = models.ForeignKey(User, on_delete=models.CASCADE) 3 title = models.CharField(max_length=255) 4 content = models.TextField() 5 description = models.TextField(verbose_name='概要',blank=True, null=True) 6 created_at = models.DateTimeField(verbose_name='作成日',auto_now=True) 7 updated_at = models.DateTimeField(verbose_name='更新日',auto_now_add=True)

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1 2class IndexView(TemplateView): 3 template_name = 'index.html' 4 def get_context_data(self, **kwargs): 5 context = super().get_context_data(**kwargs) 6 user = get_object_or_404(User, username=self.kwargs.get('username')) 7 context['user'] = user 8 context['post_data'] = user.post_set.all() 9 return context 10

追記

Python

1# views.py 2class IndexView(ListView): 3 model = Post 4 template_name = 'post/index.html' 5 context_object_name = 'post_data' 6 paginate_by = 5 7 8 def get_queryset(self): 9 return Post.objects.filter(user=get_object_or_404(User, username=self.kwargs.get('username')) 10 11 def get_context_data(self, **kwargs): 12 context = super().get_context_data(**kwargs) 13 context['user'] = get_object_or_404(User, username=self.kwargs.get('username')) 14 return context 15 16# urls.py 17path("<str:username>/", views.IndexView.as_view()),

投稿2020/05/07 00:44

編集2020/05/07 09:11
ForestSeo

総合スコア2720

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

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

退会済みユーザー

退会済みユーザー

2020/05/07 01:48

おはようごうざいます! 昨日に引き続きアドバイスありがとうございます。 試したところ、 PostIndexView is missing a QuerySet. Define PostIndexView.model, PostIndexView.queryset, or override PostIndexView.get_queryset(). が発生したので、 model = Postを追加しました。すると、 name 'context' is not definedが発生しましたので、 context = super().get_context_data(**kwargs)を追加したのですが、上手くいきません。 何かわかりますでしょうか? 何から何まで申し訳ないです。
ForestSeo

2020/05/07 03:11 編集

urls.pyはどんな感じですか? context = super().get_context_data(**kwargs)はいると思います。すみません。 model = Postは多分いらないと思います。 あと、user.post_set.all()は何を指しているんですか? Post.objects.filter(user=user)とかじゃなくて urls.pyを path("<str:username>/", views.IndexView.as_view(), name="index"), こんな感じにしてやってみたら僕の環境だとできました。 あとできれば投稿モデル(models.py)も見せてください。
退会済みユーザー

退会済みユーザー

2020/05/07 04:17

こんにちは! すいません、もう一度試したら上手くいきました! とても助かりました。 ありがとうございました!
ForestSeo

2020/05/07 04:22

こちらこそお役に立ててよかったです。
退会済みユーザー

退会済みユーザー

2020/05/07 04:29

もう一点だけお聞きしたいのですが、paginate_by を使いたい場合は、TemplateViewでは無く、ListViewを使う必要が出てくるのと思うのですが、その場合はどこを変更すれば良いでしょうか?
ForestSeo

2020/05/07 05:19

--view.py-- from django.core.paginator import Paginator class IndexView(TemplateView): template_name = 'index.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) user = get_object_or_404(User, username=self.kwargs.get('username')) context['user'] = user post_data = user.post_set.all() post_data = Paginator(post_data , 2) context['post_data'] = post_data .get_page(self.kwargs.get('num')) return context --urls.py-- path("<str:username>/<int:num>/", views.IndexView.as_view()), Pagenaitorでいけると思うんですが... urlパラメーターにusernameとnumを渡し、例えば Tom/1 にアクセスするとTomの投稿の最初の2つが出ると思います。 一ページに何個出すかはPaginator(post_data , 2)の2をご自分で変えてください。
退会済みユーザー

退会済みユーザー

2020/05/07 06:47

お手数掛けてばかりで申し訳ないです。いまいち上手くいきません。 色々と試してみますので、ListvViewを使った方法が分かれば教えて頂きたいです????
ForestSeo

2020/05/07 08:19 編集

回答を追記しました。
退会済みユーザー

退会済みユーザー

2020/05/07 08:56

ご丁寧にありがとうございました。 とても助かります???? ちなみに、これですと、特定のユーザーの投稿では無く、全ユーザーの投稿を取得してしまうみたいのですが、いかがでございましょうか?????
ForestSeo

2020/05/07 09:13

こんな感じですか?(修正しました)
退会済みユーザー

退会済みユーザー

2020/05/07 11:27

度々ありがとうございます???? SyntaxError: invalid syntaxが出ているので、色々試行錯誤してみます????
ForestSeo

2020/05/07 11:38

ManyToManyField使ってますか? get_queryset関数のfilterがおかしいかも。
退会済みユーザー

退会済みユーザー

2020/05/07 12:13

ManyToManyFieldは使って無いです????
退会済みユーザー

退会済みユーザー

2020/05/07 12:55

やはり、get_queryset関数に原因がありそうですね???? 原因を探り中です????
退会済みユーザー

退会済みユーザー

2020/05/07 13:52

苦戦してますので、もし何か分かりましたら、アドバイス頂けると助かります???? お手数ばかりです申し訳ないです????
ForestSeo

2020/05/07 20:13

僕自分のところでやってみたらエラー出なかったんですけどね... どんな感じでfilter使ってますか。
退会済みユーザー

退会済みユーザー

2020/05/07 23:57

おはようございます! 追記のコードそのまま使用しているのですが???? 何故でしょう????
ForestSeo

2020/05/08 00:13

投稿モデルはどんな感じですか?
退会済みユーザー

退会済みユーザー

2020/05/08 00:20

追記しました。 やはり、SyntaxError: invalid syntaxが出てしまいます????
ForestSeo

2020/05/08 00:26 編集

あっ分かりました。 return Post.objects.filter(user=get_object_or_404(User, username=self.kwargs.get('username')) カッコとじがない! 一番最後にカッコとじをつけてください
退会済みユーザー

退会済みユーザー

2020/05/08 00:34

全く気が付きませんでした???? 助かりました! 本当にありがとうございました????
ForestSeo

2020/05/08 00:44

SyntaxError: invalid syntaxの時はif文のコロン(:)がなかったり、カッコ閉じてなかったりするんでPythonの文が根本的におかしいと思ってエラーに取り組みましょう。 解決してよかったです。
退会済みユーザー

退会済みユーザー

2020/05/08 00:46

長々とありがとうございました????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問