Get a form Field for a ManyToManyField.
(self, db_field, request, **kwargs)
| 345 | return db_field.formfield(**kwargs) |
| 346 | |
| 347 | def formfield_for_manytomany(self, db_field, request, **kwargs): |
| 348 | """ |
| 349 | Get a form Field for a ManyToManyField. |
| 350 | """ |
| 351 | # If it uses an intermediary model that isn't auto created, don't show |
| 352 | # a field in admin. |
| 353 | if not db_field.remote_field.through._meta.auto_created: |
| 354 | return None |
| 355 | db = kwargs.get("using") |
| 356 | |
| 357 | if "widget" not in kwargs: |
| 358 | autocomplete_fields = self.get_autocomplete_fields(request) |
| 359 | if db_field.name in autocomplete_fields: |
| 360 | kwargs["widget"] = AutocompleteSelectMultiple( |
| 361 | db_field, |
| 362 | self.admin_site, |
| 363 | using=db, |
| 364 | ) |
| 365 | elif db_field.name in self.raw_id_fields: |
| 366 | kwargs["widget"] = widgets.ManyToManyRawIdWidget( |
| 367 | db_field.remote_field, |
| 368 | self.admin_site, |
| 369 | using=db, |
| 370 | ) |
| 371 | elif db_field.name in [*self.filter_vertical, *self.filter_horizontal]: |
| 372 | kwargs["widget"] = widgets.FilteredSelectMultiple( |
| 373 | db_field.verbose_name, db_field.name in self.filter_vertical |
| 374 | ) |
| 375 | if "queryset" not in kwargs: |
| 376 | queryset = self.get_field_queryset(db, db_field, request) |
| 377 | if queryset is not None: |
| 378 | kwargs["queryset"] = queryset |
| 379 | |
| 380 | form_field = db_field.formfield(**kwargs) |
| 381 | if ( |
| 382 | isinstance(form_field.widget, SelectMultiple) |
| 383 | and form_field.widget.allow_multiple_selected |
| 384 | and not isinstance( |
| 385 | form_field.widget, (CheckboxSelectMultiple, AutocompleteSelectMultiple) |
| 386 | ) |
| 387 | ): |
| 388 | msg = _( |
| 389 | "Hold down “Control”, or “Command” on a Mac, to select more than one." |
| 390 | ) |
| 391 | help_text = form_field.help_text |
| 392 | form_field.help_text = ( |
| 393 | format_lazy("{} {}", help_text, msg) if help_text else msg |
| 394 | ) |
| 395 | return form_field |
| 396 | |
| 397 | def get_autocomplete_fields(self, request): |
| 398 | """ |
no test coverage detected