Я создаю веб-сайт, который позволяет пользователю следить за определенными акциями и просматривать статьи, связанные с тем, что они следуют. В 'index.html' я хотел бы показать только последние 5 Article
s для каждого Stock
, за которым следует пользователь.
Как это можно сделать?
models.py:
class Stock(models.Model):
name = models.CharField(max_length = 50)
ticker = models.CharField(max_length = 50)
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
followed_stocks = models.ManyToManyField(Stock, blank=True)
@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
instance.profile.save()
class Article(models.Model):
stock = models.ForeignKey(Stock, on_delete=models.CASCADE, default = 0 )
title = models.CharField(max_length = 200)
url = models.URLField()
description = models.TextField()
views.py:
def index(request):
stocks_user_follows = list(request.user.profile.followed_stocks.all())
articles_to_display = Article.objects.filter(stock__in = stocks_user_follows)
return render(request, 'core/index.html', {'stocks_user_follows':stocks_user_follows, 'articles_to_display':articles_to_display})
index.html:
<div class="container">
<div class="row">
{% for stock in stocks_user_follows %}
<div class="col-md-4">
<div class="card">
<h2>{{ stock }}</h2>
<ul>
{% for article in articles_to_display %}
{% if article.stock == stock %}
<li><a href="{{article.url}}">{{ article.title }}</a></li>
{% endif %}
{% endfor %}
</ul>
<a href="#" class="btn btn-light w-50 mx-auto mb-4">All {{ stock }} News</a>
</div>
</div>
forms.py:
class StockFollowForm(forms.Form):
stocks = forms.ModelMultipleChoiceField(required =False,
widget=forms.CheckboxSelectMultiple,
queryset=Stock.objects.all(),
label= "",
)