Вы определили поле following
, которое указывает на модель пользователь , а не на Profile
. В результате Profile
не имеет отношения followed_by
, объект User
имеет.
Я думаю, что, вероятно, лучше following
указать на Profile
, например:
class UserProfile(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
related_name='profile',
null=True,
blank=True
)
following = models.ManyToManyField(
<b>'self'</b>,
related_name='followed_by',
<b>symmetrical=False,</b>
blank=True
)
def __str__(self):
return str(self.following.all().count())
Тогда вы можете сделать это так:
<div class="col-sm-3 col-xs-12" style="background-color: yellow">
<h1>{{ object.username }}</h1>
<p>Followers: {{ object.followed_by.count }}</p>
</div>
<div class="col-sm-9 col-xs-12">
<h1>Tweets</h1>
{% for tweet in object.tweet_set.all %}
{{ tweet }}<br/>
{% endfor %}
<hr/>
<h1>Following</h1>
{% for <b>profile</b> in object.profile.following.all %}
<a href='/{{ <b>profile.user.username</b> }}'>{{ <b>profile.user.username</b> }}</a><br/>
{% empty %}
<h4>Not following any users</h4>
{% endfor %}
<hr/>
<h1>Followed By</h1>
{% for profile in object.profile.followed_by.all %}
<a href='/{{ <b>profile.user.username</b> }}'>{{ <b>profile.user.username</b> }}</a><br/>
{% empty %}
<h4>Not followed by any user</h4>
{% endfor %}
</div>
Однако в вашем коде есть (серьезные) анти-паттерны. Наиболее важным является то, что вы должны не писать бизнес-логику в шаблоне. Вы должны использовать вид для этого. Например, вы можете указать в представлении контекст как:
context = {
'tweets': object.tweet_set.all()
'followers': object.profile.following.<b>select_related('user')</b>.all()
'followed_by': object.profile.followed_by.<b>select_related('user')</b>.all()
}
Здесь мы также можем использовать .select_related()
[Django-doc] , который значительно повысит производительность, поскольку теперь все пользователи выбираются в одном запросе.
Вам также лучше использовать шаблонный тег {% url ... %}
[Django-doc] для построения запросов. Поэтому вместо того, чтобы писать:
<a href="<s>/{{ profile.user.username }}</s>">
лучше построить запрос, используя обратный поиск, например:
<a href="/<b>{% url 'profile_view' username=profile.user.username %}</b>">