#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.