呈现 HTML 页面时如何在 Django 中使用与用户关联的模型

How to use models associated with a user in Django when rendering an HTML page

我正处于 django 的学习阶段。刚开始做项目学习框架,过程中遇到了一系列的问题

我基本上想为创建任务列表的用户创建单独的页面,并将 post 个任务放到他们自己的页面上。

从 django.db 导入模型 来自 django.contrib.auth.models 导入用户

# Create your models here.
class UserProfile(models.Model):
    # This line is required. Links UserProfile to a User model instance.
    user = models.OneToOneField(User)
    # The additional attributes we wish to include.
    website = models.URLField(blank = True)
    # Override the __unicode__() method to return out something meaningful!
    def __unicode__(self):
        return self.user.username

class TaskItem(models.Model):
    taskn = models.CharField(max_length = 400)
    usern = models.ForeignKey(User)

在我的模板中,如果用户输入了他们的任务,我该如何调用它来呈现到页面上?

我的看法:

def profile_page(request, username):
    user = User.objects.get(username=username)
    taskitems = user.taskn_set.all()
    return render_to_response('profile.html', {}, context)

当前问题:

'User' object has no attribute 'taskn_set'

{{ request.user.taskitem_set.all }} 会给你所有相关的任务项目。现在,要在您的模板中显示它:

{% for task_item in user.taskitem_set.all %}
    {{ task_item.task_n }}
{% endfor %}

将显示任务列表。

这是reverse-queries on foreign key (related_name) Also, read this

上的文档

你会这样做:

{% for task in user.taskitem_set.all %}
    {{ task.task_n }}
{% endfor %}

这将获取与您的用户相关的所有 TaskItem 实例。 (注意 额外的数据库查询

虽然我不知道您的视图是如何工作的,但我会假设您进行了正确的检查以确保每个用户只能看到他自己的任务。

一个 性能技巧 你会发现最有用的是使用 prefetch_related('taskitem_set'),这将预取 TaskItem 实例,只要你的 UserProfile具有一个查询的实例:

user = User.objects.filter(id=user_id).prefetch_related('taskitem_set')

您可以调整代码以符合您的喜好。

希望对您有所帮助!