Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Django模板中单独模型上的user_id字段输出用户名_Python_Django_Authentication_Templating - Fatal编程技术网

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

Python 从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

创建帖子时,用户的用户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)
    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 %}