diff --git a/django/forms/models.py b/django/forms/models.py --- a/django/forms/models.py +++ b/django/forms/models.py @@ -150,7 +150,8 @@ data[f.name] = f.value_from_object(instance) return data -def fields_for_model(model, fields=None, exclude=None, widgets=None, formfield_callback=lambda f, **kwargs: f.formfield(**kwargs)): +def fields_for_model(model, fields=None, exclude=None, widgets=None, fields_kwargs=None, + formfield_callback=lambda f, **kwargs: f.formfield(**kwargs)): """ Returns a ``SortedDict`` containing form fields for the given model. @@ -171,10 +172,12 @@ continue if exclude and f.name in exclude: continue - if widgets and f.name in widgets: - kwargs = {'widget': widgets[f.name]} + if fields_kwargs and f.name in fields_kwargs: + kwargs = fields_kwargs[f.name].copy() else: kwargs = {} + if widgets and f.name in widgets: + kwargs['widget'] = widgets[f.name] formfield = formfield_callback(f, **kwargs) if formfield: field_list.append((f.name, formfield)) @@ -194,6 +197,7 @@ self.fields = getattr(options, 'fields', None) self.exclude = getattr(options, 'exclude', None) self.widgets = getattr(options, 'widgets', None) + self.fields_kwargs = getattr(options, 'fields_kwargs', None) class ModelFormMetaclass(type): @@ -216,8 +220,8 @@ opts = new_class._meta = ModelFormOptions(getattr(new_class, 'Meta', None)) if opts.model: # If a model is defined, extract form fields from it. - fields = fields_for_model(opts.model, opts.fields, - opts.exclude, opts.widgets, formfield_callback) + fields = fields_for_model(opts.model, opts.fields, opts.exclude, + opts.widgets, opts.fields_kwargs, formfield_callback) # Override default model fields with any custom declared ones # (plus, include all the other declared fields). fields.update(declared_fields) diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py --- a/tests/modeltests/model_forms/models.py +++ b/tests/modeltests/model_forms/models.py @@ -322,6 +322,24 @@ >>> CategoryForm.base_fields.keys() ['name'] +Using 'fields_kwargs' + +>>> class CategoryForm(ModelForm): +... +... class Meta: +... model = Category +... fields = ['name', 'url', 'slug'] +... fields_kwargs = { +... 'name': {'label': 'Category name', 'widget': forms.Textarea(attrs={'rows': '5', 'cols': '20'})}, +... 'url': {'max_length': 30}, +... 'slug': {'max_length': 10, 'widget': forms.TextInput(attrs={'class': 'slug'})}, +... } + +>>> print CategoryForm() +