Fixed #11277 -- Hid labels of fields with HiddenInput widget in admin forms.
Thanks bartTC for the report.
This commit is contained in:
parent
bcd4c3f27d
commit
dc3d2ac98c
|
@ -84,6 +84,9 @@ class Fieldline(object):
|
||||||
self.fields = [field]
|
self.fields = [field]
|
||||||
else:
|
else:
|
||||||
self.fields = field
|
self.fields = field
|
||||||
|
self.has_visible_field = not all(field in self.form.fields and
|
||||||
|
self.form.fields[field].widget.is_hidden
|
||||||
|
for field in self.fields)
|
||||||
self.model_admin = model_admin
|
self.model_admin = model_admin
|
||||||
if readonly_fields is None:
|
if readonly_fields is None:
|
||||||
readonly_fields = ()
|
readonly_fields = ()
|
||||||
|
|
|
@ -18,6 +18,10 @@ form .form-row p {
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
/* FORM LABELS */
|
/* FORM LABELS */
|
||||||
|
|
||||||
form h4 {
|
form h4 {
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
<div class="description">{{ fieldset.description|safe }}</div>
|
<div class="description">{{ fieldset.description|safe }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% for line in fieldset %}
|
{% 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 %}">
|
<div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
|
||||||
{% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
|
{% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
|
||||||
{% for field in line %}
|
{% 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 %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
|
<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 %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
|
||||||
{% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
|
{% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
|
||||||
{% if field.is_checkbox %}
|
{% if field.is_checkbox %}
|
||||||
{{ field.field }}{{ field.label_tag }}
|
{{ field.field }}{{ field.label_tag }}
|
||||||
|
|
|
@ -30,7 +30,8 @@ from .models import (Article, Chapter, Account, Media, Child, Parent, Picture,
|
||||||
AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod,
|
AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod,
|
||||||
AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated,
|
AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated,
|
||||||
RelatedPrepopulated, UndeletableObject, UnchangeableObject, UserMessenger, Simple, Choice,
|
RelatedPrepopulated, UndeletableObject, UnchangeableObject, UserMessenger, Simple, Choice,
|
||||||
ShortMessage, Telegram, FilteredManager)
|
ShortMessage, Telegram, FilteredManager, EmptyModelHidden,
|
||||||
|
EmptyModelVisible, EmptyModelMixin)
|
||||||
|
|
||||||
|
|
||||||
def callable_year(dt_value):
|
def callable_year(dt_value):
|
||||||
|
@ -709,6 +710,36 @@ class ChoiceList(admin.ModelAdmin):
|
||||||
fields = ['choice']
|
fields = ['choice']
|
||||||
|
|
||||||
|
|
||||||
|
# Tests for ticket 11277 ----------------------------------
|
||||||
|
|
||||||
|
class FormWithoutHiddenField(forms.ModelForm):
|
||||||
|
first = forms.CharField()
|
||||||
|
second = forms.CharField()
|
||||||
|
|
||||||
|
class FormWithoutVisibleField(forms.ModelForm):
|
||||||
|
first = forms.CharField(widget=forms.HiddenInput)
|
||||||
|
second = forms.CharField(widget=forms.HiddenInput)
|
||||||
|
|
||||||
|
class FormWithVisibleAndHiddenField(forms.ModelForm):
|
||||||
|
first = forms.CharField(widget=forms.HiddenInput)
|
||||||
|
second = forms.CharField()
|
||||||
|
|
||||||
|
class EmptyModelVisibleAdmin(admin.ModelAdmin):
|
||||||
|
form = FormWithoutHiddenField
|
||||||
|
fieldsets = (
|
||||||
|
(None, {
|
||||||
|
'fields':(('first', 'second'),),
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
|
class EmptyModelHiddenAdmin(admin.ModelAdmin):
|
||||||
|
form = FormWithoutVisibleField
|
||||||
|
fieldsets = EmptyModelVisibleAdmin.fieldsets
|
||||||
|
|
||||||
|
class EmptyModelMixinAdmin(admin.ModelAdmin):
|
||||||
|
form = FormWithVisibleAndHiddenField
|
||||||
|
fieldsets = EmptyModelVisibleAdmin.fieldsets
|
||||||
|
|
||||||
site = admin.AdminSite(name="admin")
|
site = admin.AdminSite(name="admin")
|
||||||
site.register(Article, ArticleAdmin)
|
site.register(Article, ArticleAdmin)
|
||||||
site.register(CustomArticle, CustomArticleAdmin)
|
site.register(CustomArticle, CustomArticleAdmin)
|
||||||
|
@ -790,6 +821,9 @@ site.register(Color2, CustomTemplateFilterColorAdmin)
|
||||||
site.register(Simple, AttributeErrorRaisingAdmin)
|
site.register(Simple, AttributeErrorRaisingAdmin)
|
||||||
site.register(UserMessenger, MessageTestingAdmin)
|
site.register(UserMessenger, MessageTestingAdmin)
|
||||||
site.register(Choice, ChoiceList)
|
site.register(Choice, ChoiceList)
|
||||||
|
site.register(EmptyModelHidden, EmptyModelHiddenAdmin)
|
||||||
|
site.register(EmptyModelVisible, EmptyModelVisibleAdmin)
|
||||||
|
site.register(EmptyModelMixin, EmptyModelMixinAdmin)
|
||||||
|
|
||||||
# Register core models we need in our tests
|
# Register core models we need in our tests
|
||||||
from django.contrib.auth.models import User, Group
|
from django.contrib.auth.models import User, Group
|
||||||
|
|
|
@ -704,3 +704,12 @@ class FilteredManager(models.Model):
|
||||||
|
|
||||||
pk_gt_1 = _Manager()
|
pk_gt_1 = _Manager()
|
||||||
objects = models.Manager()
|
objects = models.Manager()
|
||||||
|
|
||||||
|
class EmptyModelVisible(models.Model):
|
||||||
|
""" See ticket #11277. """
|
||||||
|
|
||||||
|
class EmptyModelHidden(models.Model):
|
||||||
|
""" See ticket #11277. """
|
||||||
|
|
||||||
|
class EmptyModelMixin(models.Model):
|
||||||
|
""" See ticket #11277. """
|
||||||
|
|
|
@ -4571,5 +4571,47 @@ class AdminKeepChangeListFiltersTests(TestCase):
|
||||||
response = self.client.post(self.get_delete_url(), {'post': 'yes'})
|
response = self.client.post(self.get_delete_url(), {'post': 'yes'})
|
||||||
self.assertRedirects(response, self.get_changelist_url())
|
self.assertRedirects(response, self.get_changelist_url())
|
||||||
|
|
||||||
|
|
||||||
class NamespacedAdminKeepChangeListFiltersTests(AdminKeepChangeListFiltersTests):
|
class NamespacedAdminKeepChangeListFiltersTests(AdminKeepChangeListFiltersTests):
|
||||||
admin_site = site2
|
admin_site = site2
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
|
||||||
|
class TestLabelVisibility(TestCase):
|
||||||
|
""" #11277 -Labels of hidden fields in admin were not hidden. """
|
||||||
|
|
||||||
|
urls = "admin_views.urls"
|
||||||
|
fixtures = ['admin-views-users.xml']
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.client.login(username='super', password='secret')
|
||||||
|
|
||||||
|
def test_all_fields_visible(self):
|
||||||
|
response = self.client.get('/test_admin/admin/admin_views/emptymodelvisible/add/')
|
||||||
|
self.assert_fieldline_visible(response)
|
||||||
|
self.assert_field_visible(response, 'first')
|
||||||
|
self.assert_field_visible(response, 'second')
|
||||||
|
|
||||||
|
def test_all_fields_hidden(self):
|
||||||
|
response = self.client.get('/test_admin/admin/admin_views/emptymodelhidden/add/')
|
||||||
|
self.assert_fieldline_hidden(response)
|
||||||
|
self.assert_field_hidden(response, 'first')
|
||||||
|
self.assert_field_hidden(response, 'second')
|
||||||
|
|
||||||
|
def test_mixin(self):
|
||||||
|
response = self.client.get('/test_admin/admin/admin_views/emptymodelmixin/add/')
|
||||||
|
self.assert_fieldline_visible(response)
|
||||||
|
self.assert_field_hidden(response, 'first')
|
||||||
|
self.assert_field_visible(response, 'second')
|
||||||
|
|
||||||
|
def assert_field_visible(self, response, field_name):
|
||||||
|
self.assertContains(response, '<div class="field-box field-%s">' % field_name)
|
||||||
|
|
||||||
|
def assert_field_hidden(self, response, field_name):
|
||||||
|
self.assertContains(response, '<div class="field-box field-%s hidden">' % field_name)
|
||||||
|
|
||||||
|
def assert_fieldline_visible(self, response):
|
||||||
|
self.assertContains(response, '<div class="form-row field-first field-second">')
|
||||||
|
|
||||||
|
def assert_fieldline_hidden(self, response):
|
||||||
|
self.assertContains(response, '<div class="form-row hidden')
|
||||||
|
|
Loading…
Reference in New Issue