Fixed #26748 -- Allowed overriding JSONField's widget with an attribute.

This commit is contained in:
Charlie Denton 2016-06-13 13:09:54 +01:00 committed by Tim Graham
parent 57eb17b8c7
commit f2c0eb19e9
2 changed files with 20 additions and 5 deletions

View File

@ -15,10 +15,7 @@ class JSONField(forms.CharField):
default_error_messages = { default_error_messages = {
'invalid': _("'%(value)s' value must be valid JSON."), 'invalid': _("'%(value)s' value must be valid JSON."),
} }
widget = forms.Textarea
def __init__(self, **kwargs):
kwargs.setdefault('widget', forms.Textarea)
super(JSONField, self).__init__(**kwargs)
def to_python(self, value): def to_python(self, value):
if value in self.empty_values: if value in self.empty_values:

View File

@ -3,7 +3,7 @@ import unittest
from django.core import exceptions, serializers from django.core import exceptions, serializers
from django.db import connection from django.db import connection
from django.forms import CharField, Form from django.forms import CharField, Form, widgets
from django.test import TestCase from django.test import TestCase
from django.utils.html import escape from django.utils.html import escape
@ -291,3 +291,21 @@ class TestFormField(PostgreSQLTestCase):
form = JsonForm({'name': 'xy', 'jfield': '{"foo"}'}) form = JsonForm({'name': 'xy', 'jfield': '{"foo"}'})
# Appears once in the textarea and once in the error message # Appears once in the textarea and once in the error message
self.assertEqual(form.as_p().count(escape('{"foo"}')), 2) self.assertEqual(form.as_p().count(escape('{"foo"}')), 2)
def test_widget(self):
"""The default widget of a JSONField is a Textarea."""
field = forms.JSONField()
self.assertIsInstance(field.widget, widgets.Textarea)
def test_custom_widget_kwarg(self):
"""The widget can be overridden with a kwarg."""
field = forms.JSONField(widget=widgets.Input)
self.assertIsInstance(field.widget, widgets.Input)
def test_custom_widget_attribute(self):
"""The widget can be overridden with an attribute."""
class CustomJSONField(forms.JSONField):
widget = widgets.Input
field = CustomJSONField()
self.assertIsInstance(field.widget, widgets.Input)