A wrapper around an inline form for use in the admin system.
| 466 | |
| 467 | |
| 468 | class InlineAdminForm(AdminForm): |
| 469 | """ |
| 470 | A wrapper around an inline form for use in the admin system. |
| 471 | """ |
| 472 | |
| 473 | def __init__( |
| 474 | self, |
| 475 | formset, |
| 476 | form, |
| 477 | fieldsets, |
| 478 | prepopulated_fields, |
| 479 | original, |
| 480 | readonly_fields=None, |
| 481 | model_admin=None, |
| 482 | view_on_site_url=None, |
| 483 | ): |
| 484 | self.formset = formset |
| 485 | self.model_admin = model_admin |
| 486 | self.original = original |
| 487 | self.show_url = original and view_on_site_url is not None |
| 488 | self.absolute_url = view_on_site_url |
| 489 | super().__init__( |
| 490 | form, fieldsets, prepopulated_fields, readonly_fields, model_admin |
| 491 | ) |
| 492 | |
| 493 | def __iter__(self): |
| 494 | for name, options in self.fieldsets: |
| 495 | yield InlineFieldset( |
| 496 | self.formset, |
| 497 | self.form, |
| 498 | name, |
| 499 | self.readonly_fields, |
| 500 | model_admin=self.model_admin, |
| 501 | **options, |
| 502 | ) |
| 503 | |
| 504 | def needs_explicit_pk_field(self): |
| 505 | return ( |
| 506 | # Auto fields are editable, so check for auto or non-editable pk. |
| 507 | self.form._meta.model._meta.auto_field |
| 508 | or not self.form._meta.model._meta.pk.editable |
| 509 | # The pk can be editable, but excluded from the inline. |
| 510 | or ( |
| 511 | self.form._meta.exclude |
| 512 | and self.form._meta.model._meta.pk.name in self.form._meta.exclude |
| 513 | ) |
| 514 | or |
| 515 | # Also search any parents for an auto field. (The pk info is |
| 516 | # propagated to child models so that does not need to be checked |
| 517 | # in parents.) |
| 518 | any( |
| 519 | parent._meta.auto_field or not parent._meta.model._meta.pk.editable |
| 520 | for parent in self.form._meta.model._meta.all_parents |
| 521 | ) |
| 522 | ) |
| 523 | |
| 524 | def pk_field(self): |
| 525 | return AdminField(self.form, self.formset._pk_field.name, False) |
no outgoing calls