Fixed #17549 -- Added a clickable link for URLFields in admin change list.
This commit is contained in:
parent
39f5bc7fc3
commit
ac2052ebc8
|
@ -225,6 +225,21 @@ table p.datetime {
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* URL */
|
||||||
|
|
||||||
|
p.url {
|
||||||
|
line-height: 20px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
color: #666;
|
||||||
|
font-size: 11px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.url a {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
/* FILE UPLOADS */
|
/* FILE UPLOADS */
|
||||||
|
|
||||||
p.file-upload {
|
p.file-upload {
|
||||||
|
|
|
@ -10,7 +10,7 @@ from django.contrib.admin.templatetags.admin_static import static
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.forms.widgets import RadioFieldRenderer
|
from django.forms.widgets import RadioFieldRenderer
|
||||||
from django.forms.util import flatatt
|
from django.forms.util import flatatt
|
||||||
from django.utils.html import escape, format_html, format_html_join
|
from django.utils.html import escape, format_html, format_html_join, smart_urlquote
|
||||||
from django.utils.text import Truncator
|
from django.utils.text import Truncator
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
@ -306,6 +306,19 @@ class AdminURLFieldWidget(forms.TextInput):
|
||||||
final_attrs.update(attrs)
|
final_attrs.update(attrs)
|
||||||
super(AdminURLFieldWidget, self).__init__(attrs=final_attrs)
|
super(AdminURLFieldWidget, self).__init__(attrs=final_attrs)
|
||||||
|
|
||||||
|
def render(self, name, value, attrs=None):
|
||||||
|
html = super(AdminURLFieldWidget, self).render(name, value, attrs)
|
||||||
|
if value:
|
||||||
|
value = force_text(self._format_value(value))
|
||||||
|
final_attrs = {'href': mark_safe(smart_urlquote(value))}
|
||||||
|
html = format_html(
|
||||||
|
'<p class="url">{0} <a {1}>{2}</a><br />{3} {4}</p>',
|
||||||
|
_('Currently:'), flatatt(final_attrs), value,
|
||||||
|
_('Change:'), html
|
||||||
|
)
|
||||||
|
return html
|
||||||
|
|
||||||
|
|
||||||
class AdminIntegerFieldWidget(forms.TextInput):
|
class AdminIntegerFieldWidget(forms.TextInput):
|
||||||
class_name = 'vIntegerField'
|
class_name = 'vIntegerField'
|
||||||
|
|
||||||
|
|
|
@ -922,6 +922,11 @@ Like all :class:`CharField` subclasses, :class:`URLField` takes the optional
|
||||||
:attr:`~CharField.max_length`argument. If you don't specify
|
:attr:`~CharField.max_length`argument. If you don't specify
|
||||||
:attr:`~CharField.max_length`, a default of 200 is used.
|
:attr:`~CharField.max_length`, a default of 200 is used.
|
||||||
|
|
||||||
|
.. versionadded:: 1.5
|
||||||
|
|
||||||
|
The current value of the field will be displayed as a clickable link above the
|
||||||
|
input widget.
|
||||||
|
|
||||||
|
|
||||||
Relationship fields
|
Relationship fields
|
||||||
===================
|
===================
|
||||||
|
|
|
@ -266,6 +266,37 @@ class AdminSplitDateTimeWidgetTest(DjangoTestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class AdminURLWidgetTest(DjangoTestCase):
|
||||||
|
def test_render(self):
|
||||||
|
w = widgets.AdminURLFieldWidget()
|
||||||
|
self.assertHTMLEqual(
|
||||||
|
conditional_escape(w.render('test', '')),
|
||||||
|
'<input class="vURLField" name="test" type="text" />'
|
||||||
|
)
|
||||||
|
self.assertHTMLEqual(
|
||||||
|
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>'
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_render_idn(self):
|
||||||
|
w = widgets.AdminURLFieldWidget()
|
||||||
|
self.assertHTMLEqual(
|
||||||
|
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>'
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_render_quoting(self):
|
||||||
|
w = widgets.AdminURLFieldWidget()
|
||||||
|
self.assertHTMLEqual(
|
||||||
|
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>'
|
||||||
|
)
|
||||||
|
self.assertHTMLEqual(
|
||||||
|
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>'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class AdminFileWidgetTest(DjangoTestCase):
|
class AdminFileWidgetTest(DjangoTestCase):
|
||||||
def test_render(self):
|
def test_render(self):
|
||||||
band = models.Band.objects.create(name='Linkin Park')
|
band = models.Band.objects.create(name='Linkin Park')
|
||||||
|
|
Loading…
Reference in New Issue