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

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

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

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

1回答

1150閲覧

Django:トップ画面のListViewでフォローユーザーのみの表示するよう指定したい

beginner_19

総合スコア0

Django

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/05/27 15:50

編集2021/05/27 16:53

#トップページに投稿を表示する際に、全投稿とフォローしている投稿の両方を表示したい。
現在Djangoを用いてアプリ制作を行なっております。
トップページにListViewを用いて投稿の一覧と検索機能を実装しております。
同ページにタイムラインという形でフォローしているユーザーのみの投稿を表示したいと考えておりますが上手く機能しません。
解決法をご教授頂きたいです。

該当のソースコード

######該当のディレクトリ
ディレクトリ

views.py

python

1class TweetSearchView(LoginRequiredMixin, generic.ListView): 2 model = Tweet 3 template_name = 'top.html' 4 5 def get_queryset(self): 6 queryset = Tweet.objects.all().order_by('-created_at') 7 query = self.request.GET.get('query') 8 9 if query: 10 queryset = queryset.filter( 11 Q(title__icontains=query) | Q(memo__icontains=query) | Q(place__icontains=query) | Q(month=query) | Q( 12 date=query) | Q(hour=query) | Q(minute=query) | Q( 13 number=query) 14 ) 15 return queryset

urls.py

python

1path('top/', views.TweetSearchView.as_view(), name='tweet_list'),

app>models.py

python

1class Tweet(models.Model): 2 """Tweetモデル""" 3 4 user = models.ForeignKey(MyUser, verbose_name='ユーザー', on_delete=models.CASCADE) 5 title = models.CharField(verbose_name='タイトル', max_length=50) 6 place = models.CharField(verbose_name='場所', max_length=20) 7 month = models.CharField(verbose_name='月', choices=((str(x), x) for x in range(1, 13)), max_length=2) 8 date = models.CharField(verbose_name='日', choices=((str(x), x) for x in range(1, 32)), max_length=2, default='') 9 hour = models.CharField(verbose_name='時間', choices=((str(x), x) for x in range(1, 24)), max_length=2, default='') 10 minute = models.CharField(verbose_name='分', choices=((str(x), x) for x in range(00, 60)), max_length=2, default='') 11 number = models.CharField(verbose_name='人数', default=2, choices=((str(x), x) for x in range(2, 101)), max_length=3,) 12 memo = models.TextField(verbose_name='メモ', null=True, blank=True, max_length=300) 13 created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True) 14 updated_at = models.DateTimeField(verbose_name='変更日時', auto_now=True) 15 16 class Meta: 17 verbose_name_plural = 'Tweet' 18 19 def __str__(self): 20 return self.title 21 22 23class Connection(models.Model): 24 follower = models.ForeignKey(MyUser, related_name='follower', on_delete=models.CASCADE) 25 following = models.ForeignKey(MyUser, related_name='following', on_delete=models.CASCADE) 26 data_created = models.DateTimeField(auto_now_add=True) 27 28 def __str__(self): 29 return "{} : {}".format(self.follower.username, self.following.username)

accounts>models.py

python

1class MyUserManager(BaseUserManager): 2 def create_user(self, email, username, age, sex, strong, hobby, introduce, password=None): 3 """ 4 Creates and saves a User with the given email, date of 5 birth and password. 6 """ 7 if not email: 8 raise ValueError('Users must have an email address') 9 if not username: 10 raise ValueError('The given username must be set') 11 12 user = self.model( 13 email=self.normalize_email(email), 14 username=self.model.normalize_username(username), 15 age=age, 16 sex=sex, 17 strong=strong, 18 hobby=hobby, 19 introduce=introduce, 20 ) 21 22 user.set_password(password) 23 user.save(using=self._db) 24 return user 25 26 def create_superuser(self, email, username, age, sex, strong, hobby, introduce, password=None): 27 """ 28 Creates and saves a superuser with the given email, date of 29 birth and password. 30 """ 31 user = self.create_user( 32 email, 33 username=username, 34 age=age, 35 sex=sex, 36 strong=strong, 37 hobby=hobby, 38 password=password, 39 introduce=introduce, 40 ) 41 user.is_admin = True 42 user.is_superuser = True 43 user.save(using=self._db) 44 return user 45 46 47class MyUser(AbstractBaseUser, PermissionsMixin): 48 email = models.EmailField( 49 verbose_name='メールアドレス', 50 max_length=255, 51 unique=True, 52 ) 53 username_validator = ASCIIUsernameValidator() 54 username = models.CharField( 55 verbose_name='ユーザーネーム', 56 max_length=50, 57 default='', 58 unique=True, 59 help_text='この項目は必須です。全角文字、半角英数字、@/./+/-/_ で50文字以下にしてください。', 60 validators=[username_validator], 61 ) 62 63 def check_age(value): 64 if value < 18 or value > 100: 65 raise ValidationError('18〜100歳で記入して下さい') 66 67 age = models.IntegerField(default=18, validators=[check_age]) 68 69 sex_choices = [('1', '男性'), ('2', '女性'), ('3', 'その他')] 70 sex = models.CharField(verbose_name='性別', max_length=2, choices=sex_choices, default='') 71 72 strong_choices = [('1', '酒豪'), ('2', '強い'), ('3', '普通'), ('4', '弱い'), ('5', '飲めない')] 73 strong = models.CharField(verbose_name='お酒の強さ', max_length=2, choices=strong_choices, default='') 74 75 hobby = models.CharField(verbose_name='趣味', max_length=200, help_text='単語で入力して下さい', default='') 76 77 introduce = models.TextField(verbose_name='自己紹介', max_length=400, default='') 78 is_active = models.BooleanField(default=True) 79 is_admin = models.BooleanField(default=False) 80 81 objects = MyUserManager() 82 83 USERNAME_FIELD = 'username' 84 REQUIRED_FIELDS = ['email', 'age'] 85 86 def __str__(self): 87 return self.email 88 89 def has_perm(self, perm, obj=None): 90 "Does the user have a specific permission?" 91 # Simplest possible answer: Yes, always 92 return True 93 94 def has_module_perms(self, app_label): 95 "Does the user have permissions to view the app `app_label`?" 96 # Simplest possible answer: Yes, always 97 return True 98 99 @property 100 def is_staff(self): 101 "Is the user a member of staff?" 102 # Simplest possible answer: All admins are staff 103 return self.is_admin 104 105 def get_absolute_url(self): 106 return reverse('nomiho:profile', kwargs={'username': self.username})

top.html

html

1{% block content %} 2 3<div class="col-sm-4 center"> 4 <form action="" method="get"> 5 <div class="input-group mb-3"> 6 <input name="query" type="text" class="form-control" value="{{ request.GET.query }}" placeholder="キーワードで検索"> 7 <div class="input-group-append"> 8 <button class="btn btn-outline-secondary" type="submit"><i class="fas fa-search"></i>検索</button> 9 </div> 10 </div> 11 </form> 12 {% for tweet in tweet_list %} 13 <a href="{% url 'app:tweet_detail' tweet.pk %}"><h3>{{ tweet.title }}</h3></a> 14 <p>{{ tweet.month }}月{{ tweet.date }}日{{ tweet.hour }}時{{ tweet.place }}</p> 15 {% empty %} 16 <p></p> 17 {% endfor %} 18</div> 19<div class="col-sm-4" id="scroll"> 20 <h1>タイムライン</h1> 21 <div class="tweet"> 22 {% for tweet in tweet_list %} 23 <a href="{% url 'app:tweet_detail' tweet.pk %}"><h3>{{ tweet.title }}</h3></a> 24 <p>{{ tweet.month }}月{{ tweet.date }}日{{ tweet.hour }}時{{ tweet.place }}</p> 25 {% empty %} 26 <p></p> 27 {% endfor %} 28 </div> 29</div> 30 31{% endblock %}

試したこと

views.pyにおいて、

python

1 def get_queryset(self, **kwargs): 2 users = self.request.user.get_following() 3 4 return Tweet.objects.filter(Q(user__in=users) | Q(user=self.request.user))

などfollowingの情報の取得が行えるようにコードを試行錯誤しましたがKeyErrorや'MyUser' object has no attributeとなってしまい解決できませんでした。


ここまで読んで下さりありがとうございます。
修正等があればすぐに修正致します。
何卒ご教授よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

viewでコンテクストを渡し、templateで展開すればよいと思われます。

python

1tweets = Tweet.objects.filter(Q(user__in=users) | Q(user=self.request.user)) 2context = { 3 "tweet_list": tweets, 4} 5 6return render(request, template_name, context)

html

1{% for tweet in tweet_list %} 2 <!-- code --> 3{% endfor %}

投稿2021/06/09 04:38

mushroom314

総合スコア29

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問