#34001: ForeignKey.formfield(): allow override for all kwargs
-------------------------------------+-------------------------------------
     Reporter:  James Pic            |                    Owner:  nobody
         Type:                       |                   Status:  new
  Cleanup/optimization               |
    Component:  Database layer       |                  Version:  4.0
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by James Pic:

Old description:

> Proposing this:
>

> {{{
> commit ec0cae2e2d0bc6ae31cf39e7c4a067810cff8fb4 (HEAD -> main,
> origin/formfield)
> Author: jpic <[email protected]>
> Date:   Sat Sep 10 00:47:17 2022 +0200
>
>     ForeignKey.formfield(): set defaults if necessary (allow override)
>
>     Allow to override defaults used by formfield() in ForeignKey
> subclasses.
>
> diff --git a/django/db/models/fields/related.py
> b/django/db/models/fields/related.py
> index 63ed2ff4c7..f9c6ff3be8 100644
> --- a/django/db/models/fields/related.py
> +++ b/django/db/models/fields/related.py
> @@ -1164,15 +1164,21 @@ class ForeignKey(ForeignObject):
>                  "its related model %r has not been loaded yet"
>                  % (self.name, self.remote_field.model)
>              )
> -        return super().formfield(
> -            **{
> -                "form_class": forms.ModelChoiceField,
> -                "queryset":
> self.remote_field.model._default_manager.using(using),
> -                "to_field_name": self.remote_field.field_name,
> -                **kwargs,
> -                "blank": self.blank,
> -            }
> -        )
> +
> +        if "form_class" not in kwargs:
> +            kwargs["form_class"] = forms.ModelChoiceField
> +
> +        if "queryset" not in kwargs:
> +            kwargs["queryset"] =
> self.remote_field.model._default_manager.using(
> +                using)
> +
> +        if "to_field_name" not in kwargs:
> +            kwargs["to_field_name"] = self.remote_field.field_name
> +
> +        if "blank" not in kwargs:
> +            kwargs["blank"] = self.blank
> +
> +        return super().formfield(**kwargs)
> }}}
>
> Also an optimization.

New description:

 Proposing to change ForeignKey.formfield() to allow overriding form_class
 and all other defaults like with other fields such as fields.UUIDField, we
 can optimize the code at the same time.


 {{{
 commit ec0cae2e2d0bc6ae31cf39e7c4a067810cff8fb4 (HEAD -> main,
 origin/formfield)
 Author: jpic <[email protected]>
 Date:   Sat Sep 10 00:47:17 2022 +0200

     ForeignKey.formfield(): set defaults if necessary (allow override)

     Allow to override defaults used by formfield() in ForeignKey
 subclasses.

 diff --git a/django/db/models/fields/related.py
 b/django/db/models/fields/related.py
 index 63ed2ff4c7..f9c6ff3be8 100644
 --- a/django/db/models/fields/related.py
 +++ b/django/db/models/fields/related.py
 @@ -1164,15 +1164,21 @@ class ForeignKey(ForeignObject):
                  "its related model %r has not been loaded yet"
                  % (self.name, self.remote_field.model)
              )
 -        return super().formfield(
 -            **{
 -                "form_class": forms.ModelChoiceField,
 -                "queryset":
 self.remote_field.model._default_manager.using(using),
 -                "to_field_name": self.remote_field.field_name,
 -                **kwargs,
 -                "blank": self.blank,
 -            }
 -        )
 +
 +        if "form_class" not in kwargs:
 +            kwargs["form_class"] = forms.ModelChoiceField
 +
 +        if "queryset" not in kwargs:
 +            kwargs["queryset"] =
 self.remote_field.model._default_manager.using(
 +                using)
 +
 +        if "to_field_name" not in kwargs:
 +            kwargs["to_field_name"] = self.remote_field.field_name
 +
 +        if "blank" not in kwargs:
 +            kwargs["blank"] = self.blank
 +
 +        return super().formfield(**kwargs)
 }}}

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34001#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/010701832475df44-c9fb143a-c3a4-4474-8bd7-f03a28226001-000000%40eu-central-1.amazonses.com.

Reply via email to