Django伪造必填字段

时间:2016-12-04 14:47:56

标签: django django-models django-admin

我想知道在创建模型(或保存)时是否需要设置可为空(null=True)的字段?

作为超级用户,我希望能够将某些字段留空,而其他工作人员则无法使用。

有没有办法做那样的事情?

提前致谢。


修改

显然,我做错了什么。

我对__init__StudentChangeForm都准确StudentCreationForm

def __init__(self, *args, **kwargs):
    self.user = kwargs.pop('user', None)
    super(StudentCreationForm, self).__init__(*args, **kwargs)  # StudentChangeForm in StudentChangeForm (obviously)

    if self.user.is_superuser:
        self.fields['picture'].required = False

我还有一个StudentAdmin类,代表我的管理员中的Student模型:

class StudentAdmin(UserAdmin):
    form = StudentChangeForm
    add_form = StudentCreationForm

    ...

    class Meta:
        model = Student

    def get_form(self, request, obj=None, **kwargs):
        kwargs.update({'user': request.user})
        # What's supposed to be here?

我在get_form中尝试了很多变体,但似乎无法找到合适的变体。

很抱歉打扰你。

1 个答案:

答案 0 :(得分:2)

你当然可以做到这一点,当有与用户有关的信息时,它会派上用场,在你需要创建对象时你不会知道自己。

因此,为此,您只需创建自己的表单并根据需要在表单中声明字段。然后,您可以在创建对象之前在表单上运行验证。

例如,这是我获得的模型管理员使用的表单;

class EventAdminForm(forms.ModelForm):
    category = forms.ModelChoiceField(
        label=_("State/Province/Territory"),
        queryset=Category.objects.none(),
        empty_label=_("---------"),
        required=False,
    )

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

        if not self.user.is_superuser:
            self.fields['category'].required = True

    class Meta:
        model = Event
        exclude = ()

与任何其他表单一样,您可以定义字段,以及是否需要它们。

因此,在更新之后,您需要将用户传递给表单。例如;

def someview(request):
    if request.method == 'POST':
        form = EventAdminForm(request.POST, user=request.user)
        if form.is_valid():
            # Do something with the data
            pass
    else:
        form = EventAdminForm(user=request.user)

如果您有表单,但想知道您是否正在编辑某个对象,或者想要创建一个表单,那么它非常简单。如果您正在进行编辑,则表单将包含一个实例属性,该属性是您正在编辑的对象。

get_from()会收到一个obj参数,如果您正在编辑该参数,则可能是该对象,但您必须检查该参数。文件在这里; https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_form

修改

好的,让我们简化一下,并将所需的逻辑放入管理员,然后根本不需要弄乱表单;

def get_form(self, request, obj=None, **kwargs):
    form = super(StudentAdmin, self).get_form(request, obj, **kwargs)

    if request.user.is_superuser:
        form.base_fields['picture'].required = False

    return form