diff --git a/embed_video/admin.py b/embed_video/admin.py
new file mode 100644
index 0000000..da9ebd8
--- /dev/null
+++ b/embed_video/admin.py
@@ -0,0 +1,44 @@
+from django import forms
+from django.utils.safestring import mark_safe
+
+from .backends import detect_backend
+from .fields import EmbedVideoField
+
+
+class AdminVideoWidget(forms.TextInput):
+ output_format = u'
' \
+ u'{video}
{input}
' \
+ u'
'
+
+ def __init__(self, attrs=None):
+ default_attrs = {'size': '40'}
+
+ if attrs:
+ default_attrs.update(attrs)
+
+ super(AdminVideoWidget, self).__init__(default_attrs)
+
+ def render(self, name, value='', attrs=None, size=(420, 315)):
+ output = super(AdminVideoWidget, self).render(name, value, attrs)
+
+ if value:
+ try:
+ backend = detect_backend(value)
+ except:
+ pass
+ else:
+ output = self.output_format.format(
+ video=backend.get_embed_code(*size),
+ input=output,
+ )
+
+ return mark_safe(output)
+
+
+class AdminVideoMixin(object):
+ def formfield_for_dbfield(self, db_field, **kwargs):
+ if isinstance(db_field, EmbedVideoField):
+ return db_field.formfield(widget=AdminVideoWidget)
+
+ return super(AdminVideoMixin, self) \
+ .formfield_for_dbfield(db_field, **kwargs)
diff --git a/embed_video/tests/tests_admin.py b/embed_video/tests/tests_admin.py
new file mode 100644
index 0000000..a6ead30
--- /dev/null
+++ b/embed_video/tests/tests_admin.py
@@ -0,0 +1,63 @@
+from unittest import TestCase
+
+from django.forms import TextInput
+
+from embed_video.admin import AdminVideoWidget, AdminVideoMixin
+from embed_video.backends import VimeoBackend
+from embed_video.fields import EmbedVideoField, EmbedVideoFormField
+
+
+class AdminVideoWidgetTestCase(TestCase):
+ def test_size(self):
+ widget = AdminVideoWidget()
+ self.assertTrue('size' in widget.attrs)
+
+ def test_overwrite_size(self):
+ widget = AdminVideoWidget(attrs={'size': 0})
+ self.assertEqual(widget.attrs['size'], 0)
+
+ def test_add_to_attrs(self):
+ widget = AdminVideoWidget(attrs={'name': 'foo'})
+ self.assertEqual(widget.attrs['name'], 'foo')
+ self.assertTrue('size' in widget.attrs)
+
+ def test_render_empty_value(self):
+ widget = AdminVideoWidget(attrs={'size': '0'})
+ self.assertEqual(widget.render('foo'),
+ '')
+
+ def test_render(self):
+ backend = VimeoBackend('https://vimeo.com/1')
+ widget = AdminVideoWidget(attrs={'size': '0'})
+ widget.output_format = '{video}{input}'
+
+ self.assertEqual(
+ widget.render('foo', backend.url, size=(100, 100)),
+ backend.get_embed_code(100, 100)
+ + ''
+ % backend.url
+ )
+
+ def test_incorrect_value(self):
+ widget = AdminVideoWidget()
+ self.assertEqual(widget.render('foo', 'abcd'),
+ '')
+
+
+class AdminVideoMixinTestCase(TestCase):
+ def test_embedvideofield(self):
+ foo = EmbedVideoField()
+ mixin = AdminVideoMixin()
+ self.assertTrue(isinstance(mixin.formfield_for_dbfield(foo),
+ EmbedVideoFormField))
+
+ def test_other_fields(self):
+ class Parent(object):
+ def formfield_for_dbfield(*args, **kwargs):
+ raise Exception
+
+ class MyAdmin(AdminVideoMixin, Parent):
+ pass
+
+ myadmin = MyAdmin()
+ self.assertRaises(Exception, myadmin.formfield_for_dbfield, 'foo')