Updated contrib.admin to use Email/URLInputs; refs #16630
This commit is contained in:
parent
7cca8d56d2
commit
2a979d2a7b
|
@ -69,6 +69,7 @@ FORMFIELD_FOR_DBFIELD_DEFAULTS = {
|
||||||
models.CharField: {'widget': widgets.AdminTextInputWidget},
|
models.CharField: {'widget': widgets.AdminTextInputWidget},
|
||||||
models.ImageField: {'widget': widgets.AdminFileWidget},
|
models.ImageField: {'widget': widgets.AdminFileWidget},
|
||||||
models.FileField: {'widget': widgets.AdminFileWidget},
|
models.FileField: {'widget': widgets.AdminFileWidget},
|
||||||
|
models.EmailField: {'widget': widgets.AdminEmailInputWidget},
|
||||||
}
|
}
|
||||||
|
|
||||||
csrf_protect_m = method_decorator(csrf_protect)
|
csrf_protect_m = method_decorator(csrf_protect)
|
||||||
|
|
|
@ -285,7 +285,14 @@ class AdminTextInputWidget(forms.TextInput):
|
||||||
final_attrs.update(attrs)
|
final_attrs.update(attrs)
|
||||||
super(AdminTextInputWidget, self).__init__(attrs=final_attrs)
|
super(AdminTextInputWidget, self).__init__(attrs=final_attrs)
|
||||||
|
|
||||||
class AdminURLFieldWidget(forms.TextInput):
|
class AdminEmailInputWidget(forms.EmailInput):
|
||||||
|
def __init__(self, attrs=None):
|
||||||
|
final_attrs = {'class': 'vTextField'}
|
||||||
|
if attrs is not None:
|
||||||
|
final_attrs.update(attrs)
|
||||||
|
super(AdminEmailInputWidget, self).__init__(attrs=final_attrs)
|
||||||
|
|
||||||
|
class AdminURLFieldWidget(forms.URLInput):
|
||||||
def __init__(self, attrs=None):
|
def __init__(self, attrs=None):
|
||||||
final_attrs = {'class': 'vURLField'}
|
final_attrs = {'class': 'vURLField'}
|
||||||
if attrs is not None:
|
if attrs is not None:
|
||||||
|
|
|
@ -13,6 +13,7 @@ class Member(models.Model):
|
||||||
name = models.CharField(max_length=100)
|
name = models.CharField(max_length=100)
|
||||||
birthdate = models.DateTimeField(blank=True, null=True)
|
birthdate = models.DateTimeField(blank=True, null=True)
|
||||||
gender = models.CharField(max_length=1, blank=True, choices=[('M','Male'), ('F', 'Female')])
|
gender = models.CharField(max_length=1, blank=True, choices=[('M','Male'), ('F', 'Female')])
|
||||||
|
email = models.EmailField(blank=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
|
@ -83,6 +83,9 @@ class AdminFormfieldForDBFieldTests(TestCase):
|
||||||
def testCharField(self):
|
def testCharField(self):
|
||||||
self.assertFormfield(models.Member, 'name', widgets.AdminTextInputWidget)
|
self.assertFormfield(models.Member, 'name', widgets.AdminTextInputWidget)
|
||||||
|
|
||||||
|
def testEmailField(self):
|
||||||
|
self.assertFormfield(models.Member, 'email', widgets.AdminEmailInputWidget)
|
||||||
|
|
||||||
def testFileField(self):
|
def testFileField(self):
|
||||||
self.assertFormfield(models.Album, 'cover_art', widgets.AdminFileWidget)
|
self.assertFormfield(models.Album, 'cover_art', widgets.AdminFileWidget)
|
||||||
|
|
||||||
|
@ -300,29 +303,29 @@ class AdminURLWidgetTest(DjangoTestCase):
|
||||||
w = widgets.AdminURLFieldWidget()
|
w = widgets.AdminURLFieldWidget()
|
||||||
self.assertHTMLEqual(
|
self.assertHTMLEqual(
|
||||||
conditional_escape(w.render('test', '')),
|
conditional_escape(w.render('test', '')),
|
||||||
'<input class="vURLField" name="test" type="text" />'
|
'<input class="vURLField" name="test" type="url" />'
|
||||||
)
|
)
|
||||||
self.assertHTMLEqual(
|
self.assertHTMLEqual(
|
||||||
conditional_escape(w.render('test', 'http://example.com')),
|
conditional_escape(w.render('test', 'http://example.com')),
|
||||||
'<p class="url">Currently:<a href="http://example.com">http://example.com</a><br />Change:<input class="vURLField" name="test" type="text" value="http://example.com" /></p>'
|
'<p class="url">Currently:<a href="http://example.com">http://example.com</a><br />Change:<input class="vURLField" name="test" type="url" value="http://example.com" /></p>'
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_render_idn(self):
|
def test_render_idn(self):
|
||||||
w = widgets.AdminURLFieldWidget()
|
w = widgets.AdminURLFieldWidget()
|
||||||
self.assertHTMLEqual(
|
self.assertHTMLEqual(
|
||||||
conditional_escape(w.render('test', 'http://example-äüö.com')),
|
conditional_escape(w.render('test', 'http://example-äüö.com')),
|
||||||
'<p class="url">Currently:<a href="http://xn--example--7za4pnc.com">http://example-äüö.com</a><br />Change:<input class="vURLField" name="test" type="text" value="http://example-äüö.com" /></p>'
|
'<p class="url">Currently:<a href="http://xn--example--7za4pnc.com">http://example-äüö.com</a><br />Change:<input class="vURLField" name="test" type="url" value="http://example-äüö.com" /></p>'
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_render_quoting(self):
|
def test_render_quoting(self):
|
||||||
w = widgets.AdminURLFieldWidget()
|
w = widgets.AdminURLFieldWidget()
|
||||||
self.assertHTMLEqual(
|
self.assertHTMLEqual(
|
||||||
conditional_escape(w.render('test', 'http://example.com/<sometag>some text</sometag>')),
|
conditional_escape(w.render('test', 'http://example.com/<sometag>some text</sometag>')),
|
||||||
'<p class="url">Currently:<a href="http://example.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example.com/<sometag>some text</sometag></a><br />Change:<input class="vURLField" name="test" type="text" value="http://example.com/<sometag>some text</sometag>" /></p>'
|
'<p class="url">Currently:<a href="http://example.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example.com/<sometag>some text</sometag></a><br />Change:<input class="vURLField" name="test" type="url" value="http://example.com/<sometag>some text</sometag>" /></p>'
|
||||||
)
|
)
|
||||||
self.assertHTMLEqual(
|
self.assertHTMLEqual(
|
||||||
conditional_escape(w.render('test', 'http://example-äüö.com/<sometag>some text</sometag>')),
|
conditional_escape(w.render('test', 'http://example-äüö.com/<sometag>some text</sometag>')),
|
||||||
'<p class="url">Currently:<a href="http://xn--example--7za4pnc.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example-äüö.com/<sometag>some text</sometag></a><br />Change:<input class="vURLField" name="test" type="text" value="http://example-äüö.com/<sometag>some text</sometag>" /></p>'
|
'<p class="url">Currently:<a href="http://xn--example--7za4pnc.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example-äüö.com/<sometag>some text</sometag></a><br />Change:<input class="vURLField" name="test" type="url" value="http://example-äüö.com/<sometag>some text</sometag>" /></p>'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue