ChoiceField - Django Forms
Last Updated :
27 May, 2025
ChoiceField in Django Forms is a field used to select a single value from a predefined list of choices. It is ideal for fields like State, Country, or any scenario where the user must pick one option from a set of known values.
- Data type: Normalizes input to a string.
- Default widget: Select (renders as a dropdown).
- Required argument: choices, an iterable of 2-tuples representing the available options.
Syntax
field_name = forms.ChoiceField(choices=CHOICES, **options)
Here, choices is either:
- An iterable of 2-tuples (e.g., [('1', 'One'), ('2', 'Two')]), or
- A callable that returns such an iterable.
Suppose you have a Django project named geeksforgeeks with an app named geeks.
Python
from django import forms
GEEKS_CHOICES = (
("1", "One"),
("2", "Two"),
("3", "Three"),
("4", "Four"),
("5", "Five"),
)
class GeeksForm(forms.Form):
geeks_field = forms.ChoiceField(choices=GEEKS_CHOICES)
Step 2: Add your app to INSTALLED_APPS in settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'geeks', # Add your app here
]
Python
from django.shortcuts import render
from .forms import GeeksForm
def home_view(request):
form = GeeksForm()
context = {'form': form}
return render(request, "home.html", context)
Here we are importing that particular form from forms.py and creating an object of it in the view so that it can be rendered in a template.
Step 4: Create the template templates/home.html
Now, to initiate a Django form you need to create home.html where one would be designing the stuff as they like. Let's create a form in home.html.
Python
<form method="GET">
{{ form }}
<input type="submit" value="Submit">
</form>
Step 5: Map the view to a URL in geeks/urls.py
Python
from django.urls import path
from .views import home_view
urlpatterns = [
path('', home_view),
]
Step 6: Run the server
python manage.py runserver
Choice FieldHow to Use ChoiceField Data in Views
When the form is submitted, the selected choice value can be accessed from the request data:
Python
def home_view(request):
form = GeeksForm()
context = {'form': form}
if request.GET:
selected_choice = request.GET.get('geeks_field')
print(selected_choice) # For debugging or further processing
return render(request, "home.html", context)
Now let's try entering data into the field.
Entering Data- For GET method, use request.GET
- For POST method, use request.POST
Fetched DataCore Field Arguments for ChoiceField
You can customize your ChoiceField with these common arguments:
Field Options | Description |
---|
required | By default, each Field class assumes the value is required, so to make it not required you need to set required=False |
---|
label | The label argument lets you specify the “human-friendly” label for this field. This is used when the Field is displayed in a Form. |
---|
label_suffix | The label_suffix argument lets you override the form’s label_suffix on a per-field basis. |
---|
widget | The widget argument lets you specify a Widget class to use when rendering this Field. |
---|
help_text | The help_text argument lets you specify descriptive text for this Field. If you provide help_text, it will be displayed next to the Field when the Field is rendered by one of the convenience Form methods. |
---|
error_messages | The error_messages argument lets you override the default messages that the field will raise. Pass in a dictionary with keys matching the error messages you want to override. |
---|
validators | The validators argument lets you provide a list of validation functions for this field. |
---|
localize | The localize argument enables the localization of form data input, as well as the rendered output. |
---|
disabled. | The disabled boolean argument, when set to True, disables a form field using the disabled HTML attribute so that it won’t be editable by users. |
---|