mirror of
https://github.com/django/django.git
synced 2025-08-04 02:48:35 +00:00
Fixed #20000 -- Allowed ModelForm meta overrides for label, help_text and error_messages
This commit is contained in:
parent
dc9c359546
commit
9e50833e22
6 changed files with 231 additions and 45 deletions
|
@ -141,7 +141,7 @@ In addition, each generated form field has attributes set as follows:
|
|||
``default`` value will be initially selected instead).
|
||||
|
||||
Finally, note that you can override the form field used for a given model
|
||||
field. See `Overriding the default field types or widgets`_ below.
|
||||
field. See `Overriding the default fields`_ below.
|
||||
|
||||
A full example
|
||||
--------------
|
||||
|
@ -388,8 +388,10 @@ include that field.
|
|||
|
||||
.. _section on saving forms: `The save() method`_
|
||||
|
||||
Overriding the default field types or widgets
|
||||
---------------------------------------------
|
||||
.. _modelforms-overriding-default-fields:
|
||||
|
||||
Overriding the default fields
|
||||
-----------------------------
|
||||
|
||||
The default field types, as described in the `Field types`_ table above, are
|
||||
sensible defaults. If you have a ``DateField`` in your model, chances are you'd
|
||||
|
@ -420,38 +422,65 @@ widget::
|
|||
The ``widgets`` dictionary accepts either widget instances (e.g.,
|
||||
``Textarea(...)``) or classes (e.g., ``Textarea``).
|
||||
|
||||
If you want to further customize a field -- including its type, label, etc. --
|
||||
you can do this by declaratively specifying fields like you would in a regular
|
||||
``Form``. Declared fields will override the default ones generated by using the
|
||||
``model`` attribute.
|
||||
.. versionadded:: 1.6
|
||||
|
||||
For example, if you wanted to use ``MyDateFormField`` for the ``pub_date``
|
||||
The ``labels``, ``help_texts`` and ``error_messages`` options were added.
|
||||
|
||||
Similarly, you can specify the ``labels``, ``help_texts`` and ``error_messages``
|
||||
attributes of the inner ``Meta`` class if you want to further customize a field.
|
||||
|
||||
For example if you wanted to customize the wording of all user facing strings for
|
||||
the ``name`` field::
|
||||
|
||||
class AuthorForm(ModelForm):
|
||||
class Meta:
|
||||
model = Author
|
||||
fields = ('name', 'title', 'birth_date')
|
||||
labels = {
|
||||
'name': _('Writer'),
|
||||
}
|
||||
help_texts = {
|
||||
'name': _('Some useful help text.'),
|
||||
}
|
||||
error_messages = {
|
||||
'name': {
|
||||
'max_length': _("This writer's name is too long."),
|
||||
},
|
||||
}
|
||||
|
||||
Finally, if you want complete control over of a field -- including its type,
|
||||
validators, etc. -- you can do this by declaratively specifying fields like you
|
||||
would in a regular ``Form``. Declared fields will override the default ones
|
||||
generated by using the ``model`` attribute. Fields declared like this will
|
||||
ignore any customizations in the ``widgets``, ``labels``, ``help_texts``, and
|
||||
``error_messages`` options declared on ``Meta``.
|
||||
|
||||
For example, if you wanted to use ``MySlugFormField`` for the ``slug``
|
||||
field, you could do the following::
|
||||
|
||||
from django.forms import ModelForm
|
||||
from myapp.models import Article
|
||||
|
||||
class ArticleForm(ModelForm):
|
||||
pub_date = MyDateFormField()
|
||||
slug = MySlugFormField()
|
||||
|
||||
class Meta:
|
||||
model = Article
|
||||
fields = ['pub_date', 'headline', 'content', 'reporter']
|
||||
|
||||
|
||||
If you want to override a field's default label, then specify the ``label``
|
||||
parameter when declaring the form field::
|
||||
If you want to override a field's default validators, then specify the
|
||||
``validators`` parameter when declaring the form field::
|
||||
|
||||
from django.forms import ModelForm, DateField
|
||||
from myapp.models import Article
|
||||
|
||||
class ArticleForm(ModelForm):
|
||||
pub_date = DateField(label='Publication date')
|
||||
slug = CharField(validators=[validate_slug])
|
||||
|
||||
class Meta:
|
||||
model = Article
|
||||
fields = ['pub_date', 'headline', 'content', 'reporter']
|
||||
|
||||
fields = ['pub_date', 'headline', 'content', 'reporter', 'slug']
|
||||
|
||||
.. note::
|
||||
|
||||
|
@ -597,7 +626,7 @@ example by specifying the widgets to be used for a given field::
|
|||
|
||||
>>> from django.forms import Textarea
|
||||
>>> Form = modelform_factory(Book, form=BookForm,
|
||||
widgets={"title": Textarea()})
|
||||
... widgets={"title": Textarea()})
|
||||
|
||||
The fields to include can be specified using the ``fields`` and ``exclude``
|
||||
keyword arguments, or the corresponding attributes on the ``ModelForm`` inner
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue