Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ModelForms:隐藏字段和强制默认值的最干净方法_Django_Django Class Based Views_Django Forms - Fatal编程技术网

Django ModelForms:隐藏字段和强制默认值的最干净方法

Django ModelForms:隐藏字段和强制默认值的最干净方法,django,django-class-based-views,django-forms,Django,Django Class Based Views,Django Forms,假设我有一个模型表单,可以由不同层次的用户填写。管理员可以编辑该表单的任何字段;但对于其他用户,我需要预定义某些字段,并且是只读和/或隐藏的 使用我的CBV的get\u form\u kwargs方法,我已经让表单意识到正在使用它的用户,并且在它的\uuuu init\uuuuu方法中,我做出相应的反应,调整表单的排除,以及字段的必需和初始属性;然后,在我的视图的表单\u valid中,我进一步强制执行这些值。但是,坦率地说,我既不确定我做的每一个手术是否真的需要,也不确定是否有我不知道的漏洞

假设我有一个模型表单,可以由不同层次的用户填写。管理员可以编辑该表单的任何字段;但对于其他用户,我需要预定义某些字段,并且是只读和/或隐藏的

使用我的CBV的
get\u form\u kwargs
方法,我已经让表单意识到正在使用它的用户,并且在它的
\uuuu init\uuuuu
方法中,我做出相应的反应,调整表单的
排除
,以及字段的
必需
初始
属性;然后,在我的视图的
表单\u valid
中,我进一步强制执行这些值。但是,坦率地说,我既不确定我做的每一个手术是否真的需要,也不确定是否有我不知道的漏洞


那么,什么是最好、最干净的方法呢?

假设没有太多的组合,我会创建一个不同的表单,以满足用户的不同需求。然后重写
def get_form_class
,并根据需要返回正确的表单。这将使不同的用例保持独立,并且如果您将来需要在不破坏其他表单的情况下进行更改,则可以提供灵活性

# models.py
class Foo(models.Model):
    bar = model.CharField(max_length=100)
    baz = model.CharField(max_length=100)
    biz = model.CharField(max_length=100)

# forms.py
class FooForm(forms.ModelForm):  # for admins
    class Meta:
        model = Foo

class FooForm(forms.ModelForm):  # users who can't see bar
    boo = forms.CharField()

    class Meta:
        model = Foo
        exclude = ['bar']

class FooFormN(forms.ModelForm):  # as many different scenarios as you need
    def __init__(self, *args, **kwargs)
        super(FooFormN, self).__init__(*args, **kwargs)
        self.fields['biz'].widget.attrs['readonly'] = True

    class Meta:
        model = Foo

# views.py
class SomeView(UpdateView):
    def get_form_class(self):
        if self.request.user.groups.filter(name="some_group").exists():
            return FooForm
        # etc.

假设没有太多的组合,我会创建一个不同的表单来满足用户的不同需求。然后重写
def get_form_class
,并根据需要返回正确的表单。这将使不同的用例保持独立,并且如果您将来需要在不破坏其他表单的情况下进行更改,则可以提供灵活性

# models.py
class Foo(models.Model):
    bar = model.CharField(max_length=100)
    baz = model.CharField(max_length=100)
    biz = model.CharField(max_length=100)

# forms.py
class FooForm(forms.ModelForm):  # for admins
    class Meta:
        model = Foo

class FooForm(forms.ModelForm):  # users who can't see bar
    boo = forms.CharField()

    class Meta:
        model = Foo
        exclude = ['bar']

class FooFormN(forms.ModelForm):  # as many different scenarios as you need
    def __init__(self, *args, **kwargs)
        super(FooFormN, self).__init__(*args, **kwargs)
        self.fields['biz'].widget.attrs['readonly'] = True

    class Meta:
        model = Foo

# views.py
class SomeView(UpdateView):
    def get_form_class(self):
        if self.request.user.groups.filter(name="some_group").exists():
            return FooForm
        # etc.

这是一种可能性。我曾经考虑过这个问题,但我没有意识到它确实有意义。这是一种可能性。我曾经考虑过这个问题,但我没有意识到它实际上是有意义的。