From dc63ad7ac09ef694f19ae1d7496367614889e6fd Mon Sep 17 00:00:00 2001 From: Maciej Jaworski Date: Mon, 12 Jun 2017 20:18:37 +0200 Subject: [PATCH] Fixed #28319 -- Made TextField with choices use a Select widget. --- django/db/models/fields/__init__.py | 4 +++- tests/model_fields/test_textfield.py | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 825440458e..260882bf5b 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -2109,7 +2109,9 @@ class TextField(Field): # Passing max_length to forms.CharField means that the value's length # will be validated twice. This is considered acceptable since we want # the value in the form field (to pass into widget for example). - defaults = {'max_length': self.max_length, 'widget': forms.Textarea} + defaults = {'max_length': self.max_length} + if not self.choices: + defaults['widget'] = forms.Textarea defaults.update(kwargs) return super().formfield(**defaults) diff --git a/tests/model_fields/test_textfield.py b/tests/model_fields/test_textfield.py index a759b64648..82e7af8fd5 100644 --- a/tests/model_fields/test_textfield.py +++ b/tests/model_fields/test_textfield.py @@ -1,5 +1,6 @@ from unittest import skipIf +from django import forms from django.db import connection, models from django.test import TestCase @@ -18,6 +19,11 @@ class TextFieldTests(TestCase): self.assertIsNone(tf1.formfield().max_length) self.assertEqual(2345, tf2.formfield().max_length) + def test_choices_generates_select_widget(self): + """A TextField with choices uses a Select widget.""" + f = models.TextField(choices=[('A', 'A'), ('B', 'B')]) + self.assertIsInstance(f.formfield().widget, forms.Select) + def test_to_python(self): """TextField.to_python() should return a string.""" f = models.TextField()