2009-09-07 3 views
2

슈퍼 유저가 아닌 사용자 계정이 2 일보다 오래된 날짜 속성을 가진 ChannelStatus 모델 입력을 저장할 수없는 경우 관리 항목 입력을 제어하려고합니다. 요청을 reqular 또는 슈퍼 사용자가 확인할 수 있지만이를 얻을 수 없도록 사용자를 가져와야합니다.관리자 유효성 검사 클래스에서 사용자 가져 오기

"request.user.is_superuser", "user.is_superuser", "self.user.is_superuser"및 "self.request.user.is_superuser"를 시도했지만 아무 것도 작동하지 않는 것 같습니다.

class ChannelStatusValidForm(forms.ModelForm): 
    class Meta: 
      model = ChannelStatus 
    def clean(self): 
     cleaned_data = self.cleaned_data 
     mydate = cleaned_data.get("date") 
     today = date.today() 
     if request.user.is_superuser:## here is the problem 
      return cleaned_data 
     elif (today - timedelta(days=2)) > mydate: 
      raise forms.ValidationError("Invalid date, maximum 2 days allowed.") 
     else: 
      return cleaned_data 
+0

'요청'개체가 없기 때문에 가능합니다. 폼 유효성 검사 함수에'RequestContext' 객체를 제공해야합니다. –

+0

ChannelStatusValidForm (forms.ModelForm, request) 클래스를 시도했지만 작동하지 않는 것 같습니다. – Hellnar

+0

그래, 나는 인터넷 검색을 시도하고 찾을 수 없거나 그것을 보내는 방법을 알아 낸다. 누군가가 곧 해결하도록 도와 줄 것입니다. –

답변

1

추가 (및 조정) 다니엘 Roseman의 답변을 another question에서 :

class ChannelStatusValidForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(MyForm, self).__init__(*args, **kwargs) 


    def clean(self): 
     cleaned_data = self.cleaned_data 
     mydate = cleaned_data.get("date") 
     today = date.today() 
     if self.request.user.is_superuser: 
      return cleaned_data 
     elif (today - timedelta(days=2)) > mydate: 
      raise forms.ValidationError("Invalid date, maximum 2 days allowed.") 
     else: 
      return cleaned_data 

을하고보기 :

myform = ChannelStatusValidForm(request.POST, request=request) 
+0

위대한! 방금 마지막 부분을 얻을 수 없었습니다. 관리자 모델의 경우 어떻게이보기를 추가 할 수 있습니까? 즉, "myform = ChannelStatusValidForm (request.POST, request = request)"을 어디에서 추가 할 것인가. – Hellnar

+0

잘 모르겠습니다. - 관리 사이트의 문서 (http : //docs.djangoproject. co.kr/ko/dev/ref/contrib/admin /)하지만 그보다 더 많은 행운을 볼 수 있습니다. –

+1

ModelAdmin의'add_view' 및/또는'change_view' 메소드를 오버라이드해야합니다. 'django.contrib.admin.options'에서 기존 버전을 찾으십시오. 안타깝게도 폼이 인스턴스화 된 라인을 변경하기위한 복사 및 붙여 넣기 코드가 상당히 많지만 현재는 도움이되지 않습니다. –

0

추가 관리자를 작성하지 않고이를 달성 할 수있는 방법이있다 조회수 :use a form metaclass in get_form() :

class ChannelStatusValidForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) # Now you can access request anywhere in your form methods by using self.request.    
     super(ChannelStatusValidForm, self).__init__(*args, **kwargs) 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     mydate = cleaned_data.get("date") 
     today = date.today() 
      request = self.request 
     if request.user.is_superuser: 
      return cleaned_data 
     elif (today - timedelta(days=2)) > mydate: 
      raise forms.ValidationError("Invalid date, maximum 2 days allowed.") 
     else: 
      return cleaned_data 
    class Meta: 
      model = ChannelStatus 

class ChannelStatusAdmin(admin.ModelAdmin): 
    form = ChannelStatusValidForm  
    def get_form(self, request, obj=None, **kwargs): 
     AdminForm = super(ChannelStatusAdmin, self).get_form(request, obj, **kwargs) 
     class ModelFormMetaClass(AdminForm): 
      def __new__(cls, *args, **kwargs): 
       kwargs['request'] = request 
       return AdminForm(*args, **kwargs) 
     return ModelFormMetaClass