我有一个简单的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要显示的内容.上面我已经满足条件时显示标准表格.
如从模型创建表单 - 选择要使用的字段中所述,有三种方法:
editable=False.从模型创建的所有表单都将排除该字段.fields在Meta内部类中定义属性以仅包含所需的字段.exclude在Meta内部类中定义属性以列出您不想要的字段.所以,如果你的模型具有领域field1,field2和field3你不想要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)
您可以使用排除属性从模型表单中删除字段
exclude = ('field_name1', 'field_name2,)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11021 次 |
| 最近记录: |