MCPcopy
hub / github.com/django/django / formfield_for_dbfield

Method formfield_for_dbfield

django/contrib/admin/options.py:206–276  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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,

Callers

nothing calls this directly

Calls 9

get_model_adminMethod · 0.80
has_add_permissionMethod · 0.45
has_change_permissionMethod · 0.45
has_delete_permissionMethod · 0.45
has_view_permissionMethod · 0.45
formfieldMethod · 0.45

Tested by

no test coverage detected