2016-02-29 55 views
0

我必須建立一個系統,讓用戶根據初始調查是否被接受逐步填寫調查。如何根據鏈接到用戶(而不是基於用戶組)的模型來設置Django權限?

這意味着在用戶登錄後,他們需要能夠填寫初步調查以進行篩選。只有在初步篩選調查獲得管理用戶(超級用戶)批准後,用戶才能訪問第二次(也是最後一次)調查。

我有一個測量模型,看起來像這樣:

class Screening_survey(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=20) 
    surname = models.Charfield(max_length=20) 
    salary = models.IntegerField() 
    is_accepted = models.NullBooleanField() 

當用戶帖子這個初步調查,他們只能在名字,姓氏和工資領域填補。最初發布調查時,'用戶'設置爲當前登錄用戶(request.user),is_accepted在後臺自動設置爲'未知'。然後由管理員超級用戶將is_accepted值更改爲「yes」或「no」。

如果針對特定用戶的表單將is_accepted字段的值設置爲yes,則該用戶應該能夠訪問下一個調查。

我看過Django的權限,但我不認爲默認權限對我來說很有用,因爲我不希望特定/組/的用戶訪問特定頁面;相反,我希望初始調查已獲批准的用戶訪問下一個視圖(最終調查)。

我也給了@user_passes_test裝飾器一些想法,但它又似乎只檢查用戶基礎上的權限,而不是以用戶和鏈接到它們的模型爲基礎。

我知道這個問題看起來很簡單 - 我對Django以及編程一般都很陌生)。

謝謝你的幫助。

回答

0

你現在在 - 你需要定義你自己的邏輯,看看用戶是否已被批准,而不是權限。權限實際上不允許您按照每個用戶或每個模型的測試方式進行測試。

有兩個地方可以定義測試的位置。無論是在視圖本身,還是通過您自己的@user_passes_test裝飾器。你已經有一個外鍵的用戶對象,這樣你就可以在視圖中寫一個測試,像這樣:

@login_required 
def survey_view(request): 
    survey = Screening_survey.objects.filter(user=request.user) 
    if survey and survey.is_accepted is 'yes': 
     # Do the remaining view logic 
    else: 
     raise PermissionDenied 

如果你想要把這個邏輯在@user_passes_test,將工作也很好。用戶對象直接傳遞(例如參見docs

+0

謝謝Tristan。這看起來好像會起作用。我會很快實施它,並提出你的答案。 – SimoneC

+0

謝謝,特里斯坦。邏輯是正確的。但是,我收到了一個錯誤,指出QuerySet(Screening_survey)沒有屬性'is_accepted'。我稍微重寫了它,然後它工作:如果Screening_survey.objects.filter(user = request.user,is_accepted =「Yes」):[其餘邏輯如下]。仍然,好邏輯! – SimoneC

相關問題