2013-10-30 96 views
0

所以,我想創建一個用戶頁面,其網址將用戶名,這樣的事情Django的 - 在模板中區分用戶

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}) 

回答

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> 
+0

好吧,我更新了視圖爲你的,只是我'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

+0

@Robin,在模板中不使用'request.user ...'但使用'user.username' – Rohan

+0

request.user depereciated?我什麼時候可以使用它? – Robin

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。

+0

好吧,我改變了我的views.py和url: 'URL(R'^資料/(? P \ w +)/ $','userprofile.views.profile_page',name ='profile'),'。 而在模板中我改變這樣的: '

  • {{request.user.username}}
  • ' 但是,當我嘗試訪問的URL是這樣的: 'HTTP://本地主機:8000 /帳號/型材/異食癖/'。 我收到一個錯誤: 'NoReverseMatch at/accounts/profile/pica/ 找不到'參數'('',)'和關鍵字參數'{}'的'參數文件'。我究竟做錯了什麼? – Robin