Hook for specifying the form Field instance for a given database Field instance. If kwargs are given, they're passed to the form Field's constructor.
(self, db_field, request, **kwargs)
| 204 | self.formfield_overrides = overrides |
| 205 | |
| 206 | def formfield_for_dbfield(self, db_field, request, **kwargs): |
| 207 | """ |
| 208 | Hook for specifying the form Field instance for a given database Field |
| 209 | instance. |
| 210 | |
| 211 | If kwargs are given, they're passed to the form Field's constructor. |
| 212 | """ |
| 213 | # If the field specifies choices, we don't need to look for special |
| 214 | # admin widgets - we just need to use a select widget of some kind. |
| 215 | if db_field.choices: |
| 216 | return self.formfield_for_choice_field(db_field, request, **kwargs) |
| 217 | |
| 218 | # ForeignKey or ManyToManyFields |
| 219 | if isinstance(db_field, (models.ForeignKey, models.ManyToManyField)): |
| 220 | # Combine the field kwargs with any options for |
| 221 | # formfield_overrides. Make sure the passed in **kwargs override |
| 222 | # anything in formfield_overrides because **kwargs is more |
| 223 | # specific, and should always win. |
| 224 | if db_field.__class__ in self.formfield_overrides: |
| 225 | kwargs = {**self.formfield_overrides[db_field.__class__], **kwargs} |
| 226 | |
| 227 | # Get the correct formfield. |
| 228 | if isinstance(db_field, models.ForeignKey): |
| 229 | formfield = self.formfield_for_foreignkey(db_field, request, **kwargs) |
| 230 | elif isinstance(db_field, models.ManyToManyField): |
| 231 | formfield = self.formfield_for_manytomany(db_field, request, **kwargs) |
| 232 | |
| 233 | # For non-raw_id fields, wrap the widget with a wrapper that adds |
| 234 | # extra HTML -- the "add other" interface -- to the end of the |
| 235 | # rendered output. formfield can be None if it came from a |
| 236 | # OneToOneField with parent_link=True or a M2M intermediary. |
| 237 | if formfield and db_field.name not in self.raw_id_fields: |
| 238 | try: |
| 239 | related_modeladmin = self.admin_site.get_model_admin( |
| 240 | db_field.remote_field.model |
| 241 | ) |
| 242 | except NotRegistered: |
| 243 | wrapper_kwargs = {} |
| 244 | else: |
| 245 | wrapper_kwargs = { |
| 246 | "can_add_related": related_modeladmin.has_add_permission( |
| 247 | request |
| 248 | ), |
| 249 | "can_change_related": related_modeladmin.has_change_permission( |
| 250 | request |
| 251 | ), |
| 252 | "can_delete_related": related_modeladmin.has_delete_permission( |
| 253 | request |
| 254 | ), |
| 255 | "can_view_related": related_modeladmin.has_view_permission( |
| 256 | request |
| 257 | ), |
| 258 | } |
| 259 | formfield.widget = widgets.RelatedFieldWidgetWrapper( |
| 260 | formfield.widget, |
| 261 | db_field.remote_field, |
| 262 | self.admin_site, |
| 263 | **wrapper_kwargs, |
nothing calls this directly
no test coverage detected