2009-09-07 38 views
2

我在尝试控制管理项条目,其中非超级用户帐户无法保存具有日期属性超过2天的ChannelStatus模型输入。我需要得到用户,以便我可以检查请求是否是请求者或超级用户,但无法实现此目的。从管理员验证类中获取用户

我已经尝试了“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

这是因为您没有'request'对象。你需要给表单验证函数一个'RequestContext'对象。 – 2009-09-07 09:22:07

+0

我尝试过类ChannelStatusValidForm(forms.ModelForm,request):但它似乎不起作用。 – Hellnar 2009-09-07 09:34:35

+0

是的,我试过Google搜索,我找不到,或者找出如何发送它。我确信我已经看到它完成了。我相信有人会帮助你尽快解决问题! – 2009-09-07 09:44:00

回答

1

添加(及调整)丹尼尔·罗斯曼的回答从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 2009-09-07 12:10:16

+0

不确定 - 我无法立即在管理站点的文档中看到任何内容(http:// docs.djangoproject。 com/en/dev/ref/contrib/admin /),但你可能比我更有运气了。 – 2009-09-07 12:40:57

+1

您需要重写ModelAdmin的'add_view'和/或'change_view'方法。在'django.contrib.admin.options'中查找现有版本。不幸的是,会有相当数量的复制粘贴代码来更改表单实例化的行,但目前无法帮助。 – 2009-09-07 13:22:01

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 
相关问题