从 Django 模板中单独模型的 user_id 字段输出用户名
Output username from user_id field on separate model in Django Template
创建 post 时,用户的用户 ID 会保存到 user_id 字段下的 post table。在主页上(现在)我正在输出 post table 中的所有 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
来达到这样的目的。例如:
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
中导入 User
。
创建一个 Form
用于创建 Post
:
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 %}
它会起作用。
你整个逻辑都是错误的:(
用户应作为 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
)或者您拥有 customized it。
Django 中的数据库查询不是 使用原始 SQL 进行的。这就是 ORM exists 的原因。因此,视图可以更改为:
@login_required
def home(request):
posts = Post.objects.order_by('-created_date')
return render(request, 'home.html', {'posts': posts})
现在您可以从模板中非常详细地访问 User
模型实例(以及 Post
模型实例)。
{% 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 这样的路径.
创建 post 时,用户的用户 ID 会保存到 user_id 字段下的 post table。在主页上(现在)我正在输出 post table 中的所有 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
来达到这样的目的。例如:
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
中导入 User
。
创建一个 Form
用于创建 Post
:
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 %}
它会起作用。
你整个逻辑都是错误的:(
用户应作为
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
模型可能是内置的 DjangoUser
模型(from django.contrib.auth.models import User
)或者您拥有 customized it。Django 中的数据库查询不是 使用原始 SQL 进行的。这就是 ORM exists 的原因。因此,视图可以更改为:
@login_required def home(request): posts = Post.objects.order_by('-created_date') return render(request, 'home.html', {'posts': posts})
现在您可以从模板中非常详细地访问
User
模型实例(以及Post
模型实例)。{% 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 这样的路径.