django - 区分模板中的用户

时间:2013-10-30 22:00:28

标签: django django-templates django-views

所以,我正在尝试创建一个用户页面,其网址将与其用户名相关联,如下所示

  

http://domain.com/accounts/profile/robin/

在该页面中,我希望该用户上传的所有照片(此处为“robin”)都显示在模板中。另一件事是,在菜单栏中,有一个request.user的配置文件页面的链接,即登录用户,假设用户是'kevin',它还会将它指向request.user的url像:

  

http://domain.com/accounts/profile/kevin/

不知怎的,我设法获得了所需的输出。但我还想要的是,即使我将url更改为request.user的名称以外的其他内容,我希望可以轻松区分request.user和其他用户名,以便我可以在模板中操作它们。所以我希望能找到这个解决方案。

但我真的不知道这是一个合适的解决方案。因为如果我将用户名更改为request.user以外的其他内容并提供其所有信息,该怎么办?有没有更好的方法呢?

的test.html:

<body>

        <div>
            <ul>
                <li><a href="/photo/">Photos</a></li>
                <li><a href="/accounts/profile/{{user_1}}/">{{user_1.username}}</a></li>
            </ul>   
        </div>

        <div id="wrapper">
            {% block content %}
            {% endblock %}
        </div>
    </body>

profile_page.html:

{% extends 'test.html' %}

{% block content %}
<p>{{user.username}}</p>

<div id="container">
{% for photo in photos %}
<img src="{{MEDIA_URL}}{{photo.image}}" width="300px" />
{% endfor %}
</div>

{% endblock %}

models.py:

 class Photo(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(upload_to=get_upload_file_name, blank=True)
    pub_date = models.DateTimeField(default=datetime.now)
    creator = models.ForeignKey(User, related_name="creator_set")
    likes = models.ManyToManyField(User, through="Like")

    class Meta:
        ordering = ['-pub_date']
        verbose_name_plural = ('Photos')

     def __unicode__(self):
        return self.title

app的urls.py:

    url(r'^profile/(?P<username>\w+)/$', 'userprofile.views.profile_page'),

views.py:

@login_required
def profile_page(request, username):
    if request.user.is_authenticated:
        user_1 = request.user
        user = User.objects.get(username=username)
        user_photos = user.creator_set.all()
        return render(request, 'profile_page.html', {'user':user,'photos':user_photos, 'user_1':user_1})

2 个答案:

答案 0 :(得分:0)

首先,您可以直接在Django模板中使用request.user,您不需要设置user_1,例如:

<li><a href="/accounts/profile/{{request.user}}/">{{request.user.username}}</a></li>

会工作得很好。

其次,获取该URL的首选方法(如果您稍后更改它将避免任何问题)将为urlpattern提供名称,如下所示:

url(r'^profile/(?P<username>\w+)/$', 'userprofile.views.profile_page', name='profile'),

然后使用模板中的url标记:

<li><a href="{% url 'profile' username=request.user.username %}">{{request.user.username}}</a></li>

然后它将始终获得正确的URL,即使您稍后更改了urlpattern。

答案 1 :(得分:0)

不是将request.user作为user_1传递给用户,而是将个人资料显示为user,而不是另外一种方式。在模板中,您已为登录用户获取user变量并执行请求。

我会将视图更新为:

@login_required
def profile_page(request, username):
    if request.user.is_authenticated:
        #no need for user, photos
        user_1 = User.objects.get(username=username)
        return render(request, 'profile_page.html', {'user_1':user_1})

此外,您不需要传递照片列表,您可以在模板本身中执行此操作。 因此,请将模板更新为:

{% extends 'test.html' %}

{% block content %}
<p>{{user_1.username}}</p>

<div id="container">
    {% for photo in user_1.creater_set.all %}
        <img src="{{MEDIA_URL}}{{photo.image}}" width="300px" />
    {% endfor %}
</div>

{% endblock %}

将test.html中的块更改为

<ul>
    <li><a href="/photo/">Photos</a></li>
    {#here you can use name of the pattern as well instead of view #}
    <li><a href="{% url 'userprofile.views.profile_page' user.username%}">             
             {{user.username}} </a></li>
</ul>