Opened 5 weeks ago

Closed 4 weeks ago

#35913 closed Cleanup/optimization (fixed)

About the FormSet class name generated through the formset_factory.

Reported by: Antoliny Owned by: Antoliny
Component: Forms Version: 5.1
Severity: Normal Keywords: FormSet, formset_factory
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

When you define Django Form, what format do you usually name it?
In my case, I usually name it "xxxForm".
The names of the forms used as examples in official documents related to Django Form are the same as my name define format.

# Working with forms docs.
class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea)
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)

# Working with forms docs.
class ArticleForm(forms.Form):
    title = forms.CharField()
    pub_date = forms.DateField()

# FormField docs.
class CommentForm(forms.Form):
    name = forms.CharField()
    url = forms.URLField()
    comment = forms.CharField()

The way django people name it may be based on the developers' tendencies or tastes, but I think most of them are built in the format as xxxForm.
The FormSet class I created by passing xxxForm name format to the formset_factory is named as follows.

>>> ArticleFormSet = formset_factory(ArticleForm)
>>> ArticleFormSet.__name__
'ArticleFormFormSet'

The name of the FormSet class created through the formset_factory in the form xxxForm name format is a little strange.
This is because when formset_factory creates a class through type, it adds a static "FormSet" to the form name.

def formset_factory(
    form,
    formset=BaseFormSet,
    extra=1,
    can_order=False,
    can_delete=False,
    max_num=None,
    validate_max=False,
    min_num=None,
    validate_min=False,
    absolute_max=None,
    can_delete_extra=True,
    renderer=None,
):
    ...
    return type(form.__name__ + "FormSet", (formset,), attrs)

I wonder if the format of these names is intended :)

Change History (11)

comment:1 by Antoliny, 5 weeks ago

Owner: set to Antoliny
Status: newassigned

comment:2 by Tim Graham, 5 weeks ago

I agree this is a bit odd. The test for the Formset.__repr__() uses a form called Choice so the result is ChoiceFormSet as expected.

As you pointed out, perhaps to match the documented convention of ending all form names with "Form" we could consider appending "Set" rather than "FormSet" if form.__name__ ends with Form. I can't think of any way this would break backward compatibility, and it might make debugging a little less confusing.

comment:3 by Antoliny, 5 weeks ago

Thank you for your good opinion @Tim Graham !
It was not found because we tested it through Choice in the test.
I agree to change "FormSet" to "Set".

comment:4 by Antoliny, 5 weeks ago

Has patch: set
Needs documentation: set
Needs tests: set

comment:5 by Antoliny, 5 weeks ago

comment:6 by Antoliny, 5 weeks ago

Needs documentation: unset
Needs tests: unset

comment:7 by Sarah Boyce, 4 weeks ago

Triage Stage: UnreviewedAccepted

comment:8 by Sarah Boyce, 4 weeks ago

Patch needs improvement: set

comment:9 by Antoliny, 4 weeks ago

Patch needs improvement: unset

comment:10 by Sarah Boyce, 4 weeks ago

Triage Stage: AcceptedReady for checkin

comment:11 by Sarah Boyce <42296566+sarahboyce@…>, 4 weeks ago

Resolution: fixed
Status: assignedclosed

In f60d5e46:

Fixed #35913 -- Prevented formset name suffix 'FormFormSet'.

Note: See TracTickets for help on using tickets.
Back to Top