繁体   English   中英

从Django模板中单独模型上的user_id字段输出用户名

[英]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 无论如何,如果有更好的方法,请告诉我。 谢谢!

您的整体逻辑是错误的:(

  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 ),也可以是您自己的(如果已自定义)

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

     @login_required def home(request): posts = Post.objects.order_by('-created_date') return render(request, 'home.html', {'posts': posts}) 
  3. 现在,您可以从模板对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

创建用于创建PostForm

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM