Python 从Django模板中单独模型上的user_id字段输出用户名
创建帖子时,用户的用户ID将保存到“用户ID”字段下的帖子表中。在现在的主页上,我正在输出post表中的所有帖子。我想根据Post对象上的用户ID将用户名输入模板 models.pyPython 从Django模板中单独模型上的user_id字段输出用户名,python,django,authentication,templating,Python,Django,Authentication,Templating,创建帖子时,用户的用户ID将保存到“用户ID”字段下的帖子表中。在现在的主页上,我正在输出post表中的所有帖子。我想根据Post对象上的用户ID将用户名输入模板 models.py class Post(models.Model): user_id = models.IntegerField() post_name = models.CharField(max_length=300) total_votes = models.IntegerField(default=0
class Post(models.Model):
user_id = models.IntegerField()
post_name = models.CharField(max_length=300)
total_votes = models.IntegerField(default=0)
created_date = models.DateTimeField()
views.py
@login_required
def home(request):
posts = Post.objects.raw('SELECT * FROM posts ORDER BY created_date DESC')
return render(request, 'home.html', {'posts': posts})
home.html
{% for post in posts %}
<div>
<a href="posts/{{post.id}}">{{ post.post_name }}</a>
<p>{{ post.created_date }}</p>
<p>{{ post.total_votes }}</p>
<p>{{ post.user_id }}</p>
</div>
{% endfor %}
编辑:最终将查询更改为:
挑选
*,u.username
从邮政p
p.user\u id=u.id上的左连接身份验证用户u
我认为你不能添加到Post对象,甚至不能将其称为Post.username。不管怎样,如果有更好的方法,请告诉我。谢谢 最好使用ForeignKey来实现此目的。例如:
class Post(models.Model):
user = models.ForeignKey(User)
post_name = models.CharField(max_length=300)
total_votes = models.IntegerField(default=0)
created_date = models.DateTimeField()
确保在models.py中导入用户
创建用于创建帖子的表单:
现在,在视图中:
def create_post(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.user = request.user
instance.save()
return # Write return here
else:
form = PostForm()
context = {
'form': form
}
return render(request, 'template_name', context)
为此创建模板并使用它创建帖子
在您的家中:
在模板中:
它会起作用。你的整个逻辑是错误的: 用户应作为外键存储到Post模型中。也就是说,一个用户可能有多个帖子,但一个帖子可能属于一个用户。诸如此类:
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
post_name = models.CharField(max_length=300)
total_votes = models.IntegerField(default=0)
created_date = models.DateTimeField()
请注意,用户模型可能是来自Django.contrib.auth.models import User的内置Django用户模型,也可能是您自己的(如果有的话)
Django中的数据库查询不是使用原始SQL进行的。这就是为什么会这样。因此,视图可以更改为:
@login_required
def home(request):
posts = Post.objects.order_by('-created_date')
return render(request, 'home.html', {'posts': posts})
现在,您可以从模板对用户模型实例和Post实例进行非常详细的pythonic访问
{% for post in posts %}
<div>
<a href="posts/{{post.id}}">{{ post.post_name }}</a>
<p>{{ post.created_date }}</p>
<p>{{ post.total_votes }}</p>
<p>{{ post.user.username }}</p>
</div>
{% endfor %}
额外提示:不要使用href=posts/{{post.id},而是尝试使用模板标记,以避免像那样硬编码url路径。是的,我清楚地知道,在Django中不应该使用原始sql。我刚刚在文档中找到了我特别需要的东西,但我仍然在学习如何使用Django,所以我现在就用我所知道的来让它工作。不过我确实做了改变,做我应该做的事情感觉好多了!谢谢另外,感谢{%url%},我肯定也会使用它。另外,你能解释一下ForeignKey中的整个相关的_名称属性吗?使用相关的_名称,在你得到一个User的实例后,比如User=User.objects.getusername='a_User_name',你可以这样做:User.posts.all而不是User.post_集。默认情况下,所有的_集都由Django追加,如果未设置相关的\u名称。它更优雅,更冗长。这将为您获取用户名为a\u user\u的用户创建的所有帖子。
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
post_name = models.CharField(max_length=300)
total_votes = models.IntegerField(default=0)
created_date = models.DateTimeField()
@login_required
def home(request):
posts = Post.objects.order_by('-created_date')
return render(request, 'home.html', {'posts': posts})
{% for post in posts %}
<div>
<a href="posts/{{post.id}}">{{ post.post_name }}</a>
<p>{{ post.created_date }}</p>
<p>{{ post.total_votes }}</p>
<p>{{ post.user.username }}</p>
</div>
{% endfor %}