从ModelForm中删除字段

sch*_*eck 8 django

我有一个简单的ModelForm:

class MyForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        del self.fields['name']
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我尝试从表单的字段列表中删除一个字段(该字段明确存在于模型中),但我得到一个例外:

TemplateSyntaxError at [..]

Caught an exception while rendering: "Key 'name' not found in Form"
Run Code Online (Sandbox Code Playgroud)

我没有写自定义表单,因此发生错误的模板是:

/templates/admin/includes/fieldset.html, error at line 4
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

- 更新 -

该问题仅出现在管理区域中.

- 更新2 -

也许跟踪转储提供了更多信息:

Original Traceback (most recent call last):
  File "/Library/Python/2.5/site-packages/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/Library/Python/2.5/site-packages/django/template/defaulttags.py", line 155, in render
    nodelist.append(node.render(context))
  File "/Library/Python/2.5/site-packages/django/template/defaulttags.py", line 239, in render
    value = bool_expr.resolve(context, True)
  File "/Library/Python/2.5/site-packages/django/template/__init__.py", line 546, in resolve
    obj = self.var.resolve(context)
  File "/Library/Python/2.5/site-packages/django/template/__init__.py", line 687, in resolve
    value = self._resolve_lookup(context)
  File "/Library/Python/2.5/site-packages/django/template/__init__.py", line 722, in _resolve_lookup
    current = current()
  File "/Library/Python/2.5/site-packages/django/contrib/admin/helpers.py", line 81, in errors
    return mark_safe(u'\n'.join([self.form[f].errors.as_ul() for f in self.fields]).strip('\n'))
  File "/Library/Python/2.5/site-packages/django/forms/forms.py", line 105, in __getitem__
    raise KeyError('Key %r not found in Form' % name)
KeyError: "Key 'name' not found in Form"
Run Code Online (Sandbox Code Playgroud)

在管理区域,我使用Grapelli主题.也许这与问题有关?

wun*_*nki 13

我有同样的问题.这就是我在新的Django(trunk)中使用它的方法:

class MyModelAdmin(admin.ModelAdmin):
    # Your stuff here..

    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_staff: # condition
            self.exclude = ('field',)
        return super(PublishAdmin, self).get_form(request, obj=obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)

通过覆盖get_form方法并将逻辑放在此处,您可以选择Form要显示的内容.上面我已经满足条件时显示标准表格.

  • 哇,当然,这是有道理的.这就是我根据自己的需要调整它的方法:a)使用`exclude = []`初始化`MyModelAdmin`(或者基数排除的是什么)然后在条件满足时执行`self.exclude.append('field')` . (2认同)

Sel*_*ene 6

从模型创建表单 - 选择要使用的字段中所述,有三种方法:

  1. 在模型中,设置editable=False.从模型创建的所有表单都将排除该字段.
  2. fieldsMeta内部类中定义属性以仅包含所需的字段.
  3. excludeMeta内部类中定义属性以列出您不想要的字段.

所以,如果你的模型具有领域field1,field2field3你不想要field3,技术#2是这样的:

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ('field1', 'field2')
Run Code Online (Sandbox Code Playgroud)

技术#3看起来像这样:

class MyModelForm(ModelForm):
    class Meta:
        model = MyModel
        exclude = ('field3',)
Run Code Online (Sandbox Code Playgroud)

  • 正如我在上面的评论中所写,我必须在__init __-方法中动态删除字段.因此,无法使用您建议的方法. (3认同)
  • 在我的项目中,有一个包含许多字段的模型,对于用户,可以选择他需要的字段子集.除了管理员后端的恼人问题之外,这已经很好了. (2认同)

M. *_*yan 0

您可以使用排除属性从模型表单中删除字段

exclude = ('field_name1', 'field_name2,)
Run Code Online (Sandbox Code Playgroud)

  • 我知道,但我必须动态删除字段。 (2认同)