ForeignKey.formfield(): allow override for all kwargs
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 <jpic@yourlabs.org>
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)
Change History
(6)
Cc: |
James Pic added
|
Component: |
Uncategorized → Database layer (models, ORM)
|
Description: |
modified (diff)
|
Type: |
Uncategorized → Cleanup/optimization
|
Description: |
modified (diff)
|
Resolution: |
→ needsinfo
|
Status: |
new → closed
|
Resolution: |
needsinfo → fixed
|
Resolution: |
fixed → invalid
|
Thanks for the ticket, however I'm a bit confused. Is it not possible? The values from
kwargs
should overrideform_class
,queryset
, andto_field_name
in**{..., **kwargs}
. The only difference is inblank
but in this case we should keep the value from a model field.