2011-07-04 21 views
0

()模型的方法我試圖重寫保存()方法,所以只有創建者和管理員能夠以更新模型字段值:重寫節省權限

if not self.pk: 
     super(Shastra, self).save(*args, **kwargs) 
else: 
     if (self.person == args[0].user) or (self.person.is_superuser): 
      super(Shastra, self).save(*args, **kwargs) 

雖然更新很傳遞請求保存方法爲

def edit(request, shastra_id): 
    shastra_id = int(shastra_id) 
    shastra = Shastra.objects.get(pk = shastra_id) 
    if request.method == 'POST': 
     form_shastra_edit = ShastraEditForm(request.POST, instance = shastra) 
     if form_shastra_edit.is_valid(): 
      form_shastra_edit.save(request) 
      return HttpResponseRedirect('/edited/successfully') 
    else: 
    form_shastra_edit = ShastraEditForm(instance = shastra) 

但是我得到「元組索引超出範圍」錯誤。這有什麼問題?

+0

我覺得ARGS [0]。用戶是request.user是相同的,因爲我通過「請求」在save()中。請幫助 –

+0

讓我知道,如果我可以澄清更多的問題。 –

+1

顯示整個'save'方法,包括聲明。 –

回答

1

您不能在Model.save()方法中使用請求。您必須在您的視圖方法中進行基於請求的驗證(例如在您的編輯方法中)。模型層是不知道的「請求」對象..

讓你的編輯方法是這樣的:

def edit(request, shastra_id): 
    shastra_id = int(shastra_id) 
    shastra = Shastra.objects.get(pk = shastra_id) 
    if request.method == 'POST': 
     form_shastra_edit = ShastraEditForm(request.POST, instance = shastra) 
     if form_shastra_edit.is_valid() and shastra.user == request.user: 
       form_shastra_edit.save(request) 
       return HttpResponseRedirect('/edited/successfully') 
    else: 
     form_shastra_edit = ShastraEditForm(instance = shastra) 
+0

我可以做到這一點,但我又想讓創建者以外的其中一個超級用戶(不是'管理員')編輯這些值。我是否需要將該支票也放在我的視圖中?有沒有辦法在模型中進行驗證? –

+0

您必須通過更改Shastra ModelAdmin來做到這一點。例如。覆蓋ShastraModelAdmin.has_change_permission(self,request,obj = None)。請參閱https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#modeladmin-methods – ivy

+1

模型 - 視圖 - 控制器模式(Django稱之爲模型 - 模板 - 視圖)的整體思想是模型代碼不知道/從網絡層解耦。這提供了「關注點分離」。將Web請求轉換爲具有權限的用戶,並在右側(Django-)視圖代碼中檢查權限即可。您可以使用「必需的權限」數據註釋您的模型類,但是這應該仍由您的(Django)視圖代碼進行檢查! – ivy