0

所以,我正在尝试创建一个用户页面,它的 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 以外的其他名称并提供其所有信息会怎样。有更好的方法吗?

测试.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 %}

模型.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'),

视图.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})
4

2 回答 2

0

首先,可以request.user直接在Django模板中使用,不需要设置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。

于 2013-10-31T02:39:44.463 回答
0

而不是传递request.userasuser_1和 user 来显示配置文件,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>   
于 2013-10-31T04:59:52.037 回答