在管理站点中创建隐藏字段

时间:2011-02-15 01:01:51

标签: django django-admin

如何在管理站点中创建完全隐藏的字段(输入和标签)? 我知道exclude属性,但它完全排除了模板中的字段,而我在网页中需要它,但隐藏了:

class OutForm(ModelForm):
    reply_to = forms.ModelChoiceField(queryset=InMessages.objects.all(), widget=forms.HiddenInput)

在管理员模板中,我实际上可以隐藏字段,但不能隐藏其标签。

5 个答案:

答案 0 :(得分:14)

Django管理员还不支持隐藏字段。有一张开放的门票:https://code.djangoproject.com/ticket/11277

但是,有些解决方法不需要jQuery。管理表单使用admin/includes/fieldset.html呈现。如果覆盖此模板,则可以注入一个CSS类来表示要隐藏的行:

<div class="form-row
    {% if line.fields|length_is:'1' and line.errors %} errors{% endif %}
    {% for field in line %} {{ field.field.name }}
      {% if field.field.is_hidden %} has-hidden-field{% endif %}  # add this part
    {% endfor %}">

这实际上是文件中的一行,我已经扩展它以使其更具可读性。

(整洁的细节:对于StackedInline / TabularInline对象,您可以在Python代码中将模板指定为变量。)

接下来,您可以在CSS中隐藏该行:

.form-row.has-hidden-field {
    display: none;
}

您可以通过管理页面加载:

{% block extrastyle %}{{ block.super }}
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}mysite/admin.css" />{% endblock %}

或使用modeladmin中的媒体定义:

class Media:
    css = {'all': ('mysite/admin.css',)

答案 1 :(得分:2)

在模板中,显示

{% for field in form.visible_fields %}
    {{ field.label_tag }} : {{ field }}
{% endfor %}

它会隐藏隐藏的字段标签。

答案 2 :(得分:1)

我觉得使用&#39;课程非常方便。字段集中的属性可隐藏字段但仍将它们保留在请求中。在您的模型管理员中,您可以编写

fieldsets = [
        ('Visible Fields', 
         {'fields': [('name', 'comment'),]}),
        ('Collapsable Fields', 
         {'fields': [('rare_property',)],'classes': ['collapse']}),
        ('Hidden Fields', 
         {'fields': [('magic_property',)],'classes': ['hidden']}),
            ]

答案 3 :(得分:0)

你在你的例子中给出ModelForm,而不是你应该用于管理站点的ModelAdmin。

无论如何,排除某些字段的方法是相同的:在exclude属性中指定它:

class OutForm(ModelForm):
  class Meta:
    exclude = ["reply_to"]

class OutAdmin(ModelAdmin):
  exclude = ["reply_to"]

有关详细信息,请参阅Django文档:http://docs.djangoproject.com/en/1.2/ref/contrib/admin/

答案 4 :(得分:0)

尝试将label =“”添加到ModelChoiceField,使标签成为空字符串:

reply_to = forms.ModelChoiceField(queryset=InMessages.objects.all(), label="", widget=forms.HiddenInput)