[英]Output username from user_id field on separate model in Django Template
创建帖子后,用户的用户ID将保存到user_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)
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 %}
编辑:最终将查询更改为:
SELECT *, u.username FROM posts p LEFT JOIN auth_user u ON (p.user_id = u.id)
我不认为您可以添加到Post对象,甚至不能将其称为post.username
。 无论如何,如果有更好的方法,请告诉我。 谢谢!
您的整体逻辑是错误的:(
用户应该被存储为ForeignKey
进入Post
的模型。 即,一个用户可能有多个Post
但是一个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()
请注意, User
模型可以是内置的Django User
模型( from django.contrib.auth.models import User
),也可以是您自己的(如果已自定义) 。
Django中的数据库查询不是使用原始SQL进行的。 这就是ORM存在的原因。 因此,视图可以更改为:
@login_required def home(request): posts = Post.objects.order_by('-created_date') return render(request, 'home.html', {'posts': posts})
现在,您可以从模板对User
模型实例(以及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 %}
额外提示:尝试使用{% url %}
模板标记,而不是href="posts/{{post.id}}"
, 以免对这样的URL路径进行硬编码。
为此,最好使用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()
确保将User
导入到models.py
。
创建用于创建Post
的Form
:
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('post_name',)
现在,在视图中:
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)
为此创建一个template
,并使用它来创建帖子。
在您view
首页:
@login_required
def home(request):
posts = Post.objects.order_by('-created_date')
return render(request, 'home.html', {'posts': posts})
在您的template
:
{% 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 %}
它会工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.