#トップページに投稿を表示する際に、全投稿とフォローしている投稿の両方を表示したい。
現在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となってしまい解決できませんでした。
ここまで読んで下さりありがとうございます。
修正等があればすぐに修正致します。
何卒ご教授よろしくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。