【问题标题】:getting the user from a admin validation class从管理员验证类中获取用户
【发布时间】:2010-11-26 04:18:35
【问题描述】:

我正在尝试控制非超级用户帐户无法保存具有超过 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

【问题讨论】:

  • 那是因为你没有request 对象。您需要为表单验证函数提供一个 RequestContext 对象。
  • 我尝试了 class ChannelStatusValidForm(forms.ModelForm,request): 但它似乎不起作用。
  • 是的,我试过谷歌搜索,但我找不到,或者想出如何发送它。我确信我已经看到它完成了。相信很快会有人帮你解决的!
  • ts 在表单中获取请求对象的问题。丹尼尔在这里回答了。 stackoverflow.com/questions/1057252/…
  • @harshh - 很棒的发现。我知道我在某处见过它,我想答案可能就在这里!

标签: django validation django-admin django-forms


【解决方案1】:

添加(和调整)来自another question 的 Daniel Roseman 的回答:

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)

【讨论】:

  • 太棒了!我只是无法得到最后一部分,视图。对于管理员模型,如何添加此视图?换句话说,我将在哪里添加“myform = ChannelStatusValidForm(request.POST, request=request)”
  • 不确定 - 我无法立即在管理站点 (docs.djangoproject.com/en/dev/ref/contrib/admin) 的文档中看到任何内容,但您可能比我更幸运地发现它。
  • 您需要覆盖 ModelAdmin 的 add_view 和/或 change_view 方法。在django.contrib.admin.options 中查找现有版本。不幸的是,将有大量的复制和粘贴代码来更改表单实例化的行,但目前无济于事。
【解决方案2】:

有一种方法可以在不创建额外管理员视图的情况下实现此目的: 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2016-06-30
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多