【问题标题】:django - differentiate users in the templatedjango - 在模板中区分用户
【发布时间】:2013-11-10 18:10:41
【问题描述】:

所以,我正在尝试创建一个用户页面,它的 url 将与其用户名相关联,就像这样

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

应用的 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})

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    不要将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>   
    

    【讨论】:

    • 好的,我将视图更新为您的视图,只是将user_1 更改为user_profile。并且使用 user.username 我可以按照您所说的访问登录用户的个人资料。只是,还有一个问题。当我尝试 request.user.username 时,为什么它给我一个错误,NoReverseMatch at /accounts/profile/pica/ Reverse for 'profile' with arguments '('',)' and keyword arguments '{}' not found.???
    • @Robin,在模板中不要使用request.user...,而是使用user.username
    • request.user 被贬低了吗?那我什么时候可以用呢?
    • @Robin,为此您需要在TEMPLATE_CONTEXT_PROCESSORS 中添加context_processors.request 参考:docs.djangoproject.com/en/dev/ref/templates/api/…
    • 好的,知道了!谢谢你。 :)
    【解决方案2】:

    首先,可以在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。

    【讨论】:

    • 好的,我更改了 views.py 和 url:url(r'^profile/(?P&lt;username&gt;\w+)/$', 'userprofile.views.profile_page', name='profile'),。在模板中,我将其更改为:&lt;li&gt;&lt;a href="{% url 'profile' request.user.username %}"&gt;{{request.user.username}}&lt;/a&gt;&lt;/li&gt; 但是当我尝试访问类似这样的 URL 时:http://localhost:8000/accounts/profile/pica/。我收到一个错误:NoReverseMatch at /accounts/profile/pica/ Reverse for 'profile' with arguments '('',)' and keyword arguments '{}' not found.。我做错了什么?
    猜你喜欢
    • 2014-06-28
    • 2011-11-14
    • 2013-04-16
    • 1970-01-01
    • 2015-06-25
    • 2021-06-08
    • 2021-01-05
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多