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

时间:2015-05-16 20:41:17

标签: django django-models django-forms

我在django的学习阶段。我只是潜入一个项目来学习框架,并在整个过程中遇到一系列问题。

我基本上希望为创建任务列表的用户提供单独的页面,并让他们将任务发布到他们自己的页面。

来自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'

2 个答案:

答案 0 :(得分:1)

{{ 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)的文档,read this

答案 1 :(得分:0)

你会做这样的事情:

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

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

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

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

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

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

希望这有帮助!