所以,我正在尝试创建一个用户页面,其网址将与其用户名相关联,如下所示
在该页面中,我希望该用户上传的所有照片(此处为“robin”)都显示在模板中。另一件事是,在菜单栏中,有一个request.user的配置文件页面的链接,即登录用户,假设用户是'kevin',它还会将它指向request.user的url像:
不知怎的,我设法获得了所需的输出。但我还想要的是,即使我将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})
答案 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>