django help text is the Django Field and Form Field attribute that displays contextual guidance text adjacent to form inputs, automatically rendered as an aria-describedby HTML attribute for accessibility.
field_name = models.Field(help_text = "text")
This attribute is optional and carries no validation logic. Use it to provide format hints, character limits, or privacy assurances directly below the input field.
Basic Usage
Defining on model fields
from django.db import models
class GeeksModel(models.Model):
geeks_field = models.DateField(
help_text="Please use the following format: <em>YYYY-MM-DD</em>."
)
Defining on form fields
from django import forms
class ContactForm(forms.Form):
age = forms.IntegerField(help_text="Enter your age in years.")
nationality = forms.CharField(help_text="Country of citizenship.")
captcha_answer = forms.IntegerField(
label="2 + 2",
label_suffix=" =",
help_text="Prove you are human."
)
Advanced Implementation & Parameters
Interaction with auto_id
When auto_id=False is passed to a form, the help text is still rendered but the aria-describedby attribute is omitted because no ID is generated. Custom templates must manually associate the help text:
f = ContactForm(auto_id=False)
print(f) # help text present but no aria-describedby
Override help text in ModelForm
Set the help_text argument in the form field definition to override the model’s default:
class GeeksForm(forms.ModelForm):
geeks_field = forms.DateField(
help_text="Override: use DD/MM/YYYY"
)
class Meta:
model = GeeksModel
fields = '__all__'
Dynamic help text based on instance data
In the form’s __init__ method, set self.fields['field_name'].help_text based on the instance or request data:
class DynamicHelpForm(forms.Form):
code = forms.CharField()
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super().__init__(*args, **kwargs)
if user.is_superuser:
self.fields['code'].help_text = "Enter admin token"
else:
self.fields['code'].help_text = "Enter your user code"
Internationalization (i18n)
Wrap help_text strings in gettext_lazy() for translation:
from django.utils.translation import gettext_lazy as _
class GeeksModel(models.Model):
geeks_field = models.DateField(
help_text=_("Use YYYY-MM-DD format")
)
Error Resolution & Troubleshooting
| Error / Symptom | Root Cause | Remediation |
|---|---|---|
ValidationError: ['This field is required.'] when field is optional |
Field defined with required=True (default) |
Add required=False to the form field |
| Help text not visible in custom template | Template does not include {{ field.help_text }} or uses form.as_table without rendering help |
Manually output <div class="helptext">{{ field.help_text }}</div> |
ValidationError: ['Enter a valid email address.'] |
Input does not match EmailField regex | Update help text to provide format example; validate client-side |
ObjectDoesNotExist on ModelChoiceField with help text |
Invalid to_field_name or queryset |
Verify queryset returns the intended objects; use to_field_name correctly |
Help text appears but aria-describedby missing |
Widget is inside a <fieldset> – Django adds aria-describedby to the fieldset, not the input |
Inspect HTML: attribute is set on the <fieldset>; this is correct for accessibility |
Why use help text over alternatives?
| Approach | Definition Location | Rendering | Use Case |
|---|---|---|---|
Model help_text |
models.py field definition |
Inherited by ModelForm, appears in admin and forms |
Centralized hints tied to database schema |
Form help_text |
forms.py Field() init |
Rendered only in that form, overrides model help_text | Per-form context (e.g., different hints for create vs edit) |
| Template-level HTML | Django template with {{ field.help_text }} |
Manually placed, no automatic aria-describedby |
Custom layout or conditional display |
| Placeholder attribute | Widget attrs in form field |
Inside the input, disappears on first keystroke | Short hints (not replacements for help text) |
Recommendation: Use model help_text for field-level hints that apply in all contexts (admin, model forms, APIs). Use form help_text when the hint changes per form, and rely on {{ field.help_text }} in templates for full control over positioning.
Rendering in templates
<form method="post">
{% csrf_token %}
{% for field in form %}
<div>
{{ field.label_tag }}
{{ field }}
<div class="helptext">{{ field.help_text }}</div>
</div>
{% endfor %}
</form>
When using form.as_p or form.as_div, the help text is automatically inserted below the input inside a <div class="helptext">.
Production-Grade Implementation
Accessibility-first
- Always provide
help_textfor fields with non-obvious format requirements. Thearia-describedbyensures screen readers announce the hint after the label. - Do not rely solely on placeholder attributes – they disappear on focus and have poor contrast in many browsers.
Security considerations
- Never include sensitive information (passwords, tokens) in
help_text– it is rendered in HTML and visible to all users. - Use conditional help_text (via
__init__) to show internal guidance only to authenticated admin users.
Performance
- Help text is static at field instantiation; for database-driven hints, use
ModelForm.__init__to set help_text based on model data. Avoid querysets inhelp_text. - For large forms with many fields, minimize overhead by defining help_text directly in the form class rather than reading from a database each request.
Frequently Asked Questions
What is the difference between help_text and verbose_name in Django model fields?
Answer: help_text displays explanatory text under form fields; verbose_name sets the human-readable label for the field.
verbose_name defaults to a capitalized version of the field name; help_text is empty by default. Example:
from django.db import models
class Product(models.Model):
sku = models.CharField(max_length=30, verbose_name="SKU", help_text="Unique stock keeping unit code.")
When should I use the --help flag with Django management commands?
Answer: Use --help to display all available subcommands, flags, and usage syntax for any manage.
Run python manage.py <command> --help to see detailed help for a specific command. Example:
python manage.py migrate --help
How do I fix “help_text not rendering” in Django admin forms?
Answer: Ensure the field’s help_text is defined in the model and that the admin template includes {{ field.help_text|safe }}.
For custom admin forms, verify your template contains:
{{ field.help_text|safe }}
Does help_text work with Django REST Framework serializers?
Answer: Yes.
Example serializer inheriting model help_text:
from rest_framework import serializers
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ['sku'] # help_text pulled from model
What is the fastest way to generate help text for all model fields in an existing Django project?
Answer: Use a one-liner in Django shell: iterate over all models and fields.
Run:
python manage.py shell -c "from django.apps import apps; [print(f'{m.__name__}: {f.name}: {f.help_text}') for m in apps.get_models() for f in m._meta.fields if f.help_text]"

Command Line Expert & Software Engineer
Welcome! I’m Thomas Heinrich, a software engineer and system administrator with a deep passion for the Command Line Interface (CLI). With years of experience navigating the terminal, building backend architectures, and automating server deployments, I created this space to share practical, real-world terminal knowledge.
Whether you are a beginner taking your first steps in a Linux environment or a seasoned DevOps engineer looking to optimize your deployment scripts, you will find actionable solutions here. My goal is to help you ditch the mouse, speed up your workflow, and harness the full power of the command line.