我在我的表单的Meta类中使用exclude
从我的表单中排除了一个我想要以编程方式填写的字段,但它仍然显示在表单中。
以下是代码的一些摘录:
# Model
class Info(models.Model):
completed_by = models.ForeignKey(User, related_name='+')
# Form
class InfoForm(forms.ModelForm):
class Meta:
model = Info
exclude = ('created_by',) #ETA: added comma to make this a tuple
widgets = {
'some_other_field': forms.HiddenInput(),
'some_other_field2': forms.DateInput(attrs={'readonly': True}),
}
# View
form = InfoForm(initial={'some_other_field': value},
prefix='info', instance=info)
return direct_to_template(request, 'myapp/info.html', locals())
# Template
<form class='uniForm' method='POST'>
{% csrf_token %}
<fieldset class='inlineLabels'>{{ form|as_uni_form }}</fieldset>
<input type='submit' name='action' value='Save' />
</form>
这看起来应该很简单,我知道我之前已经成功完成了。我删除/重新创建了我的数据库并清除了我的浏览器缓存,只是为了确保这不是一个因素。我也尝试将其设为HiddenInput
字段,就像some_other_field
(也是ForeignKey
字段一样),但它仍显示在表单上。
这里有什么东西我不见了? uni_form会以某种方式覆盖设置吗?如果没有,有什么建议我可以在调试中查找,看看发生在哪里/为什么会发生这种情况?
(使用Django 1.2.7版)
答案 0 :(得分:14)
排除需要一个元组,所以你需要
# note the extra comma
exclude = ('created_by',)
django遍历exclude
,因为字符串是可迭代的(返回每个字符),所以不会抛出错误
答案 1 :(得分:1)
对于较旧的Django版本,排除您明确声明的非模型字段存在问题,例如:在父表单类中。在表单的init中添加以下内容即使对于非模型字段也会处理它(请参阅https://code.djangoproject.com/ticket/8620)。
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
[self.fields.pop(f) for f in self.fields.keys() if f in self.Meta.exclude]
答案 2 :(得分:0)
我知道这已经过时但是在此作为参考发布。
我遇到了同样的问题,因为我在模型上重载clean_fields()
,但没有正确调用超类。
class MyModel(models.Model):
foo = models.BooleanField()
# Wrong! Don't do this!
def clean_fields(self, exclude=None):
# Bah! Forgetting to pass exclude defaults it to None!
super(MyModel, self).clean_fields()
if not self.foo:
raise ValidationError('Ah fooey.')
# Correct! Do it this way!
def clean_fields(self, exclude=None):
# That's better! Let's take a coffee break. I'm tired.
super(MyModel, self).clean_fields(exclude)
if not self.foo:
raise ValidationError('Ah fooey.')