我有一些看起来像这样的Django表单代码:
class GalleryAdminForm(forms.ModelForm):
auto_id=False
order = forms.CharField(widget=forms.HiddenInput())
这使得表单字段消失了,但它在Django管理页面中留下了标签“Order”。如果我使用:
order = forms.CharField(widget=forms.HiddenInput(), label='')
我仍然在字段和标签之间留下“:”。
如何隐藏整个事情?!
答案 0 :(得分:38)
Oraculum做对了。你不应该在客户端清理它。如果它是杂乱的,那么你根本不应该把它发送到客户端。在Oraculum的答案的基础上,您应该使用自定义表单模板,因为您可能仍然需要表单中的隐藏值。
{% for field in form.visible_fields %}
<div>
{{ field.errors }}
<span class="filter-label">{{ field.label_tag }}</span><br>
{{ field }}
</div>
{% endfor %}
{% for field in form.hidden_fields %}
<div style="display:none;">{{ field }}</div>
{% endfor %}
使用自定义表单模板来控制隐藏字段更加清晰,因为它不会向客户端发送无关信息。
答案 1 :(得分:36)
我无法相信有几个人建议使用jQuery ...
是否是这样的情况:当你知道的唯一工具是锤子时,一切看起来像钉子?
来吧,如果你打算从客户端做到这一点(而不是在后端代码中修复问题的根源),肯定正确的地方是CSS?
如果您在管理网站中,那么它有点难,但如果它是常规页面,那么很容易从表单模板for example
中省略整个标签如果您在管理站点中,那么您仍然可以覆盖GalleryAdminForm类中的BaseForm的as_table,as_ul,as_p方法(请参阅django / forms / forms.py),以省略标签所在的任何字段的标签。空白(或==':',因为值可能处于渲染的这个阶段)
(...查看forms.py的第160-170行似乎Django 1.2应该正确省略':'如果标签是空白的,那么我猜你的版本是旧的?)
答案 2 :(得分:17)
尝试
{%for form in form.visible_fields%}
答案 3 :(得分:3)
我认为通过修改class AdminField(object)
中的contrib/admin/helpers.py
来实现HiddenInput小部件的“:”标签省略更为简单:
if self.is_checkbox:
classes.append(u'vCheckboxLabel')
contents = force_unicode(escape(self.field.label))
else:
contents = force_unicode(escape(self.field.label)) + u':'
到:
if self.is_checkbox:
classes.append(u'vCheckboxLabel')
contents = force_unicode(escape(self.field.label))
else:
contents = force_unicode(escape(self.field.label))
#MODIFIED 26/10/2009
if self.field.label <> '':
contents += u':'
# END MODIFY
答案 4 :(得分:3)
在Create a hidden field in the admin site检查答案,可以在没有JavaScript的情况下通过覆盖admin/includes/fieldset.html
来完成。从那里,您可以注入一个CSS类,然后完成剩下的工作。
答案 5 :(得分:2)
理论上,您应该能够将label_suffix
传递给表单构造函数。但是,Django管理员忽略了这一点。
你被Django中的两个错误所困扰:#18134 'BoundField.label_tag should include form.label_suffix'(固定在主干中,应该在1.6中),在较小程度上#11277 Hidden fields in Inlines are displayed as empty rows。
目前,最佳解决方案是覆盖admin字段集模板。对您的小部件使用HiddenInput
,然后覆盖管理字段集模板(documented here)。只需使用以下内容创建templates/admin/includes/fieldset.html
:
<fieldset class="module aligned {{ fieldset.classes }}">
{% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
{% if fieldset.description %}
<div class="description">{{ fieldset.description|safe }}</div>
{% endif %}
{% for line in fieldset %}
<div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
{% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
{% for field in line %}
<div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}>
{% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
{% if field.is_checkbox %}
{{ field.field }}{{ field.label_tag }}
{% else %}
{# only show the label for visible fields #}
{% if not field.field.is_hidden %}
{{ field.label_tag }}
{% endif %}
{% if field.is_readonly %}
<p>{{ field.contents }}</p>
{% else %}
{{ field.field }}
{% endif %}
{% endif %}
{% if field.field.help_text %}
<p class="help">{{ field.field.help_text|safe }}</p>
{% endif %}
</div>
{% endfor %}
</div>
{% endfor %}
</fieldset>
答案 6 :(得分:2)
根据Wilfried Hughes的解决方案,我改变了fieldset.html,但收效甚微。
下面的代码片段不仅隐藏了输入元素,如果fieldset只包含一个input-type设置为hidden的单个元素,它也隐藏了周围的div元素,在表单中没有空间。
<fieldset class="module aligned {{ fieldset.classes }}">
{% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
{% if fieldset.description %}
<div class="description">{{ fieldset.description|safe }}</div>
{% endif %}
{% for line in fieldset %}
<div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}"{% if line.fields|length_is:'1' %}{% for field in line %}{% if field.field.is_hidden %} style="display: none"{% endif %}{% endfor %}{% endif %}>
{% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
{% for field in line %}
<div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}{% if field.field.is_hidden %} style="display: none"{% endif %}>
{% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
{% if field.is_checkbox %}
{{ field.field }}{{ field.label_tag }}
{% else %}
{# only show the label for visible fields #}
{% if not field.field.is_hidden %}
{{ field.label_tag }}
{% endif %}
{% if field.is_readonly %}
<p>{{ field.contents }}</p>
{% else %}
{{ field.field }}
{% endif %}
{% endif %}
{% if field.field.help_text %}
<p class="help">{{ field.field.help_text|safe }}</p>
{% endif %}
</div>
{% endfor %}
</div>
{% endfor %}
答案 7 :(得分:0)
以下内容从您的所有表单字段中删除“:”。我只使用forms.Form
类进行了尝试,但我相信它也适用于forms.ModelForm
。
在Django表单中,标签后面的':'是label_suffix
。您可以通过创建label_suffix
的子类(此处称为ModelForm
)来更改或删除UnstyledForm
,并重新定义初始化函数,并将label_suffix
设置为空字符串。然后使用新的UnstyledForm
课程。
class UnstyledForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super(UnstyledForm, self).__init__(*args, **kwargs)
class GalleryAdminForm(UnstyledForm):
auto_id=False
order = forms.CharField(widget=forms.HiddenInput())
我希望有所帮助!
答案 8 :(得分:0)
另一种方法,但我认为迭代form.visible_fields&amp; form.hidden_fields
data.push($scope.item[arrayData[x]]);
答案 9 :(得分:-19)
如果您正在使用JQuery,这应该可以解决问题:
您的表单
TO_HIDE_ATTRS = {'class': 'hidden'}
class GalleryAdminForm(forms.ModelForm):
auto_id=False
order = forms.CharField(widget=forms.TextInput(attrs=TO_HIDE_ATTRS))
要添加到模板的Javascript代码
$(document).ready(function(){
$('tr:has(.hidden)').hide();
});
如果您将表单呈现为表格,则该方法有效。如果您想使其适用于任何类型的表单呈现,您可以执行以下操作:
$(document).ready(function(){
$('{{ form_field_container }}:has(.hidden)').hide();
});
将form_field_container
添加到模板上下文中。一个例子:
如果您像这样渲染表单:
<form>
<span>{{ field.label_tag }} {{ field }}</span>
</form>
您的上下文必须包含:
'form_field_container': 'span'
你明白了......