2013-12-13 77 views
0

我失去了:(使用登錄的用戶找到相關的模型在Django

我仍然在努力學習Django的,並已決定繼續前進,只使用基於類的意見,因爲基於函數的觀點我做了基於功能的視圖,似乎能夠導航他們沒有太大的問題我可以移動請求,並獲得用戶信息等

因爲它現在,我已經建立了一些模型,涉及用戶,但我似乎無法根據登錄用戶將這些視爲我的通用視圖。


現有型號:

class Common(models.Model): 
    "User abstraction for carrying general info." 
    user = models.OneToOneField(User, related_name="%(app_label)s_%(class)s_related") 
    ...some methods/properties... 


class Employee(Common): 
    "Employee specific info." 
    ...some methods/properties... 

我想要在我的意見做的是檢查登錄用戶,拉動相應的員工。

我目前看來是這樣的:

class v_UserDetail(DetailView): 
    # model = Employee 
    template_name = "user.html" 

    def get_object(self): 
     return get_object_or_404(User, self.request.user) 

我想到我應該可以做一些事來的Employee.user.get_object(id='')的影響,但我不知道如何讓登錄的用戶的ID。

現在可能是我沒有足夠的經驗與Django直接進入課堂觀點,但我只是迷失了。我一直在翻閱文檔和教程,他們似乎都希望我已經理解傳遞到通用視圖的內容。

注:我對Python的2.7

運行的Django 1.6

議決
感謝來自@karthikr評論下面,我能夠做一個小的調整,並讓它運行。新觀點是:

class v_UserDetail(DetailView): 
    template_name = "user.html" 

    def get_object(self): 
     return get_object_or_404(Employee, id = self.request.user.id) 

我現在如何編輯的get_object功能檢查等相關課程,但是這讓我在那裏我想要的。我可以僅基於登錄的用戶拉動其他對象。

改進
我發現,我正在這樣難度比是必要的。用戶對象具有將相關模型拉入模板的能力,因此我將查找的對象全部放在一起。新的模板具有這樣的:

{% if user.employee %} 
      {% include 'employee/emp_profile.html' %} 
{% endif %} 
+0

之前,我將它張貼作爲一個答案,是有原因,你不只是使用[的DetailView(https://docs.djangoproject.com/en/dev/ref/ Employee模型的基於類的視圖/通用顯示/#detailview)? –

+0

基於功能的視圖不被棄用。基於功能的_generic_視圖將會。 –

+1

試試這個:'get_object_or_404(User,id = self.request.user.id)' – karthikr

回答

0

您可以在URL pk,同時仍保留您想要的隱私。只需使用普通的DetailView,如:

class PersonDetailView(DeatilView): 
    model = Employee 
    context_object_name = "employee" 
    template_name_suffix = "_detail" 

而且在你的模板是這樣的:

{% if request.user == employee.user %} 
Show user content 
{% else %} 
Show message to say you're not allowed to see this 
{% endif %} 

你也應該看看django-braces,這使得重定向到和登錄頁註銷用戶要簡單得多。例如,你可以更新視圖上面的樣子:

class PersonDetailView(LoginRequiredMixin, DeatilView): 
    model = Employee 
    context_object_name = "employee" 
    template_name_suffix = "_detail" 
    login_url = "your_login_url" 

,它會重定向登錄用戶到登錄頁面,並返還給僱員的細節,一旦他們進行身份驗證。

1

如果我理解你是正確的,你想根據用戶信息設置視圖模型。試着這樣說:

class v_UserDetail(DetailView): 

    def dispatch(self, request, *args, **kwargs): 
     super(v_UserDetail, self).dispatch(request, *args, **kwargs) 
     if request.user.common_set: # change common_set according to your related_name 
      self.model = Common 
     if request.user.employee_set: 
      self.model = Employee 
+1

儘管這並沒有回答我提到的具體問題,但它確實指向了一個繼續的方向。謝謝!我可能應該提到共同點是元抽象。 – meteorainer