从 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 %}

它会起作用。

你整个逻辑都是错误的:(

  1. 用户应作为 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

  2. Django 中的数据库查询不是 使用原始 SQL 进行的。这就是 ORM exists 的原因。因此,视图可以更改为:

    @login_required
    def home(request):
        posts = Post.objects.order_by('-created_date')
        return render(request, 'home.html', {'posts': posts})
    
  3. 现在您可以从模板中非常详细地访问 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 这样的路径.