基本思想是能够基于模型权限检查(使用基于类的通用视图)隐藏某些表单字段。 显然,我可以重写view的getpost来检查表单权限并构造表单,但是不是有一种更整洁的方法来实现这一点吗?

到目前为止,视图和表单非常简单

class UserProfileUpdateView(UpdateView):
    model = UserProfile
    template_name = "profile/update.html"
    form_class = UserProfileForm


class UserProfileForm(forms.ModelForm):
def __init__(self, can_change_position=False, can_change_manager=False, *args, **kwargs):
    super(UserProfileForm, self).__init__(*args, **kwargs)
    self._process_permission('position', can_change_position)
    self._process_permission('manager', can_change_manager)

def _process_permission(self, field, permitted):
    if permitted:
        self.fields.append(field)

class Meta:
    model = UserProfile
    fields = ['field1', 'field2', 'field3', ...]

我是否缺少明显的东西,或者只是遵循错误的方式?

更新后的样子似乎不太明确。 我发布的代码中有一个错误,因此到目前为止给出的答案是如何解决该错误。 我已经修复了它,但是问题不在于如何在运行时添加/删除表单上的字段(很明显)。 问题是,有什么方法可以使用基于类的通用视图基于request值(例如request.user )添加/删除字段。

因此,再次,直接的方法是重载视图上的getpost ,执行检查并实例化表单。 但这在某种程度上重复了现有的django行为(即,管理员视图将request传递给get_form )。 那么,难道没有更清洁的方法来实现这一目标吗?

===============>>#1 票数:0

是的,您的__init__方法是在__new__方法之后__new__ ,该方法实际上使用了'Meta.exclude'属性。 (当这种对动态类魔术的声明性属性发生时)

看一下django源代码行198。因此在运行时,您已经具有所有实例变量。

解决类似问题的方法,我在这里发布:

CSV上载前未设置任何格式

希望能有所帮助

===============>>#2 票数:0

在表单类本身上设置了名为base_fields属性,在您的情况下为UserProfileForm 创建此表单的实例(即UserProfileForm() ,将在表单实例上设置一个名为fields的属性,该属性是表单类上可用的base_fields副本。

并且base_fields是在元类中设置的,通常您不希望更改元类。 此外, Meta.excludeMeta.fields在元类使用__new__ ,所以改变它们在__init__形式不会有任何影响。

因此,您可以做的是从__init__的表单实例的属性fields中删除不需要的fields

码:

class UserProfileForm(forms.ModelForm):
    def __init__(self, can_change_position=False, can_change_manager=False, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        self._process_permission('position', can_change_position)
        self._process_permission('manager', can_change_manager)         

    def _process_permission(self, field, permitted):
        if not permitted and field in self.fields:
            del self.fields[field]

  ask by J0HN translate from so

未解决问题?本站智能推荐:

1回复

如何使用HTML属性将表单字段设置为只读而不是禁用

我想将我的字段设置为只读形式。 我已经在表单中使用了禁用功能,但是当表单触发POST请求时,它不会将我的数据发送到数据库中。 因此,我检查了该元素,并手动将readonly属性添加到其HTML代码中,以检查readread是否有效。 并且readonly在提交表单时没有问题。 但是
1回复

Django-将视图中的值设置为任何值时,将表单字段更改为只读

在我的view.py中,我有一个变量-例如'email'。 在我的forms.py中,我有一个电子邮件字段-例如: 我想将其更改为: 当我的view.py中的电子邮件变量填充时(从无到任何值)。 默认情况下,电子邮件设置为“无”。 我该如何实现?
2回复

从表单字段中检查表单是否有效[Django]

我在Django中创建了一个文本字段表单字段,为字段创建自己的自定义窗口小部件。 我想知道是否可以检查表单中的所有其他字段是否有效(我希望其服务器端行为根据其他字段的验证而变化) 见评论 就像是:
4回复

为什么Django中的只读表单字段是个坏主意?

我一直在寻找一种创建只读表单字段的方法,我在这个主题上发现的每篇文章都附带一个声明“这是一个坏主意”。 现在对于单个表单,我可以理解还有其他方法可以解决问题,但在modelformset中使用只读表单字段似乎是一个完全自然的想法。 考虑一个教师成绩簿应用程序,老师希望能够通过一个SUBM
6回复

将Django表单字段更改为隐藏字段

我有一个带有RegexField的Django表单,与正常的文本输入字段非常相似。 我认为,在某些情况下,我想向用户隐藏它,并尝试使表单尽可能相似。 将此字段转换为HiddenInput字段的最佳方法是什么? 我知道我可以使用以下方法在字段上设置属性: 我可以通过以下方式设
2回复

Django:如何隐藏所有表单字段?

我有一个包含大约8个字段的Django表单类。 如何动态地将所有这些表单字段隐藏在我的视图之一中? 样品: 之所以要这样做,是因为我将在一个注册页面中使用相同的表单,然后在其他地方再次使用类似的表单,在这些地方我希望这些表单字段被隐藏。 我不想创建一个单独的类,使用“ widg
4回复

你如何动态隐藏Django中的表单字段?

我正在Django制作个人资料表格。 有很多可选的额外配置文件字段,但我只想一次显示两个。 如何隐藏或删除我不想动态显示的字段? 这是我到目前为止:
1回复

Django表单字段小部件被隐藏

模型字段作为foreign_key链接到另一个具有大量条目的模型。 我决定用简单的链接替换foreign_keys默认选择。 除了隐藏字段之外,它还能奏效! 我应该怎么做才能避免这种情况? admin.py wdiget_file.py
1回复

有什么方法可以在CreateView表单中创建隐藏的表单字段?

有什么方法可以在CreateView表单中创建隐藏的表单字段? 我必须将一些数据(评论的父项)传递给数据库。 与ModelForm一起使用效果很好,我将JS的父级传递给隐藏字段: 如何用CreateView表单做同样的事情?
1回复

如何在Django模型中为arrayfield设置表单字段

我的模型中有一个相关名称的字段 我希望此字段显示为具有多个选择的选择字段。 如何在表单中设置字段以实现此目的?