2013-03-05 92 views
4

定義URL模式時,我應該使用正則表達式從URL中獲取PK。如何將當前登錄用戶用作Django DetailView的PK?

如果我想要一個沒有PK的URL,如果沒有提供,它會使用當前登錄的用戶?例子:

  • 訪問/user將獲得的的DetailView當前登錄的用戶
  • /user/edit將呈現的UpdateView爲當前登錄的用戶

我試圖在Detail.as_view()硬編碼pk=呼叫但它報告無效的關鍵字。

如何在URL配置文件中指定?

顯示PK所需錯誤來訪 /user URL時

我的示例代碼:

urlpatterns = patterns('', 
    url(r'user/$', 
     DetailView.as_view(
      model=Account, 
      template_name='user/detail.html')), 
)` 
+0

發佈您的代碼 – catherine 2013-03-05 03:36:28

+0

添加了片段。 – radj 2013-03-05 04:33:16

回答

4

另一種做法將是壓倒一切的DetailView子類的get_object方法,東西沿線:

class CurrentUserDetailView(UserDetailView): 
    def get_object(self): 
     return self.request.user 

基於類視圖的精神比mixin方法更乾淨,更簡單,更有精神。

編輯:爲了澄清,我相信兩個不同的URL模式(即一個pk和另一個沒有)應該在urlconf中單獨定義。因此,它們也可以由兩種不同的視圖提供服務,特別是因爲這會使代碼更清晰。在這種情況下,URL配置看起來是這樣的:

urlpatterns = patterns('', 
    url(r"^users/(?P<pk>\d+)/$", UserDetailView.as_view(), name="user_detail"), 
    url(r"^users/current/$", CurrentUserDetailView.as_view(), name="current_user_detail"), 
    url(r"^users/$", UserListView.as_view(), name="user_list"), 
) 

而且我已經更新了我上面的例子要注意,它繼承了UserDetailView,這使得它更清潔,而且很清楚它到底是什麼:一個特殊的父視圖的情況。

+0

只是一個評論,因爲你似乎正在比較你的方法,我的直接子類視圖**更簡單**,但少**可重用**。 mixin可以重複使用,混合(doh)和多個視圖,共享相同的基本行爲:3 – asermax 2013-03-05 13:59:17

+0

絕對如此。我並沒有把它們比作一個優於另一個的意義上的比較,我的意思是說每個用例都有一個更好的用例。 – 2013-03-05 20:35:04

0

通用視圖使用始終RequestContext。 Django文檔中的this段說,當使用RequestContext和auth應用程序時,模板會通過代表當前用戶登錄的user變量。因此,請繼續,並隨時在您的模板中引用用戶。

+0

謝謝你,但我不是指模板。我想讓它在模板之外完成。 – radj 2013-03-05 04:30:44

0

您可以從request object獲取當前用戶的詳細信息。如果您想查看其他用戶的詳細信息,可以將網址作爲參數傳遞給用戶。的URL將被編碼的像:

url(r'user/(?P<user_id>.*)$', 'views.user_details', name='user-details'), 

views.user_details第二參數是user_id它是一個字符串(可以改變正則表達式中的URL來限制的整數值,但該參數將仍然字符串類型)。 Here是來自Django文檔的url模式的其他示例列表。

2

據我所知,你不能在URL定義中定義它,因爲你無法訪問這些信息。

但是,您可以可以做的是創建您自己的mixin並使用它來構建您想要的行爲。

你的混入會是這個樣子:

class CurrentUserMixin(object): 
    model = Account 

    def get_object(self, *args, **kwargs): 
     try: 
      obj = super(CurrentUserMixin, self).get_object(*args, **kwargs) 
     except AttributeError: 
      # SingleObjectMixin throws an AttributeError when no pk or slug 
      # is present on the url. In those cases, we use the current user 
      obj = self.request.user.account 

     return obj 

,然後,讓你的自定義視圖:

class UserDetailView(CurrentUserMixin, DetailView): 
    pass 

class UserUpdateView(CurrentUserMixin, UpdateView): 
    pass 
相關問題