Skip to content

Commit

Permalink
[1.6.x] Updated contrib.admin to use Email/URLInputs; refs #16630
Browse files Browse the repository at this point in the history
Backport of 2a979d2 from master
  • Loading branch information
timgraham committed Jul 26, 2013
1 parent 7f892ce commit 5cc1ea4
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 6 deletions.
1 change: 1 addition & 0 deletions django/contrib/admin/options.py
Expand Up @@ -69,6 +69,7 @@ class IncorrectLookupParameters(Exception):
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)
Expand Down
9 changes: 8 additions & 1 deletion django/contrib/admin/widgets.py
Expand Up @@ -285,7 +285,14 @@ def __init__(self, attrs=None):
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:
Expand Down
1 change: 1 addition & 0 deletions tests/admin_widgets/models.py
Expand Up @@ -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
Expand Down
13 changes: 8 additions & 5 deletions tests/admin_widgets/tests.py
Expand Up @@ -83,6 +83,9 @@ def testIntegerField(self):
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)


Expand Down Expand Up @@ -300,29 +303,29 @@ def test_render(self):
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/&lt;sometag&gt;some text&lt;/sometag&gt;</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/&lt;sometag&gt;some text&lt;/sometag&gt;</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/&lt;sometag&gt;some text&lt;/sometag&gt;</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/&lt;sometag&gt;some text&lt;/sometag&gt;</a><br />Change:<input class="vURLField" name="test" type="url" value="http://example-äüö.com/<sometag>some text</sometag>" /></p>'
) )




Expand Down

0 comments on commit 5cc1ea4

Please sign in to comment.