为什么我的页面上没有显示 followed_by(followers) 条目
why i am not getting a followed_by(followers) entry showing up on my page
我正在做一个类似克隆的推特(只是为了了解 django 中的工作原理)
所以我基本上是在尝试建立 many_to_many 关系。
我想添加显示 'FOLLOWED_BY' 和 'FOLLOWING' 到用户个人资料的功能,但是页面上没有显示 'FOLLOWED_BY' 的列表,请有人帮助我!
在 models.py 中我定义了两个关系
user = models.OneToOneField(settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL, related_name='profile', null=True,
blank=True)
following = models.ManyToManyField(settings.AUTH_USER_MODEL,
related_name='followed_by', blank=True)
并且在 user_detail.html 中我有配置文件应该是什么样子的代码
这是 models.py 模块:
from django.conf import settings
from django.db import models
# Create your models here.
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(settings.AUTH_USER_MODEL,
related_name='followed_by', blank=True)
def __str__(self):
return str(self.following.all().count())
下面是 user_detail.html 文件的代码:
{% extends "base.html" %}
{% block content %}
<div class="row">
<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 user in object.profile.following.all %}
<a href='/{{ user.username }}'>{{ user.username }}</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='/{{ profile.user.username }}'>{{ profile.user.username }}</a><br/>
{% empty %}
<h4>Not followed by any user</h4>
{% endfor %}
</div>
{% endblock content %}
对于用户个人资料,我得到了我想要的 FOLLOWING 字段,但是 FOLLOWED_BY 字段没有显示我该怎么做(我应该在我的代码中做哪些更改)??
您定义了一个 following
字段,该字段指向 user 模型,而不是 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>
但是您的代码有一些(严重的)anti-patterns。最重要的一点是,您应该不在模板中编写业务逻辑。您应该为此使用视图。例如,您可以在视图中指定如下上下文:
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 ... %}
template tag [Django-doc] 来构造查询。所以不要写:
<a href="<s>/{{ profile.user.username }}</s>">
最好使用反向查找来构造查询,例如:
<a href="/<b>{% url 'profile_view' username=profile.user.username %}</b>">
我正在做一个类似克隆的推特(只是为了了解 django 中的工作原理) 所以我基本上是在尝试建立 many_to_many 关系。 我想添加显示 'FOLLOWED_BY' 和 'FOLLOWING' 到用户个人资料的功能,但是页面上没有显示 'FOLLOWED_BY' 的列表,请有人帮助我!
在 models.py 中我定义了两个关系
user = models.OneToOneField(settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL, related_name='profile', null=True,
blank=True)
following = models.ManyToManyField(settings.AUTH_USER_MODEL,
related_name='followed_by', blank=True)
并且在 user_detail.html 中我有配置文件应该是什么样子的代码
这是 models.py 模块:
from django.conf import settings
from django.db import models
# Create your models here.
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(settings.AUTH_USER_MODEL,
related_name='followed_by', blank=True)
def __str__(self):
return str(self.following.all().count())
下面是 user_detail.html 文件的代码:
{% extends "base.html" %}
{% block content %}
<div class="row">
<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 user in object.profile.following.all %}
<a href='/{{ user.username }}'>{{ user.username }}</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='/{{ profile.user.username }}'>{{ profile.user.username }}</a><br/>
{% empty %}
<h4>Not followed by any user</h4>
{% endfor %}
</div>
{% endblock content %}
对于用户个人资料,我得到了我想要的 FOLLOWING 字段,但是 FOLLOWED_BY 字段没有显示我该怎么做(我应该在我的代码中做哪些更改)??
您定义了一个 following
字段,该字段指向 user 模型,而不是 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>
但是您的代码有一些(严重的)anti-patterns。最重要的一点是,您应该不在模板中编写业务逻辑。您应该为此使用视图。例如,您可以在视图中指定如下上下文:
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 ... %}
template tag [Django-doc] 来构造查询。所以不要写:
<a href="<s>/{{ profile.user.username }}</s>">
最好使用反向查找来构造查询,例如:
<a href="/<b>{% url 'profile_view' username=profile.user.username %}</b>">