How can I create a fully hidden field (input and label) in the admin site?
I know about the exclude
property, but it fully excludes the field from the template,
You're giving ModelForm in your example, not ModelAdmin you should be using for admin site.
Anyway, method of excluding some field is the same: specify it in exclude
property:
class OutForm(ModelForm):
class Meta:
exclude = ["reply_to"]
or
class OutAdmin(ModelAdmin):
exclude = ["reply_to"]
See Django documentation for details: http://docs.djangoproject.com/en/1.2/ref/contrib/admin/
In the template, while displaying
{% for field in form.visible_fields %}
{{ field.label_tag }} : {{ field }}
{% endfor %}
It will hide the hidden field labels.
I found it quite handy to use the 'classes' attribute in fieldsets to hide fields but still leave them in a request. In your model admin you can write
fieldsets = [
('Visible Fields',
{'fields': [('name', 'comment'),]}),
('Collapsable Fields',
{'fields': [('rare_property',)],'classes': ['collapse']}),
('Hidden Fields',
{'fields': [('magic_property',)],'classes': ['hidden']}),
]
Try adding label="" to your ModelChoiceField to make the label an empty string:
reply_to = forms.ModelChoiceField(queryset=InMessages.objects.all(), label="", widget=forms.HiddenInput)
The Django admin does not support hidden fields yet. There is an open ticket for that: https://code.djangoproject.com/ticket/11277
However, there are workarounds that don't require jQuery. The admin forms are rendered using admin/includes/fieldset.html
. If you override this template, you can inject a CSS class to denote the row for hiding:
<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 %}">
this is actually a single line in the file, I've expanded it to make it more readable.
( Neat detail: for an StackedInline/TabularInline objects, you can specify the template as variable in Python code. )
Next, you can hide that row in your CSS:
.form-row.has-hidden-field {
display: none;
}
Which you can load via your admin page:
{% block extrastyle %}{{ block.super }}
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}mysite/admin.css" />{% endblock %}
or by using the media definition in the modeladmin:
class Media:
css = {'all': ('mysite/admin.css',)