Модели Django: Как настроить значение поля на основе другого поля при создании нового элемента модели в интерфейсе администратора? - PullRequest
0 голосов
/ 02 июня 2019

У меня есть две родственные модели: Plaint и WritOfExecutionTemplate.Можно добавить новый шаблон на странице редактирования текста, используя класс admin.TabularInline.Когда пользователь создает новый шаблон со страницы жалоб, мне нужно заполнить 2 поля доверенности (POA) на основе текущей жалобы.Пользователь может изменить POA до того, как шаблон будет сохранен.

enter image description here

Я попытался установить метод обратного вызова для атрибута default поля, но у меня естьпроблема с получением объекта-ссылки.

class AbstractGeneratedCaseDocument(AbstractBaseModel):
    class Meta:
        abstract = True

    case = models.ForeignKey(
        verbose_name=_('case'),
        to='Case',
        on_delete=models.PROTECT,
    )
    power_of_attorney = models.ForeignKey(
        verbose_name=_('power of attorney'),
        to='ImportedDocument',
        on_delete=models.PROTECT,
        null=True,
        blank=True,
        related_name='+',
    )
    power_of_attorney_2 = models.ForeignKey(
        verbose_name=_('power of attorney') + ' 2',
        to='ImportedDocument',
        on_delete=models.PROTECT,
        null=True,
        blank=True,
        related_name='+',
    )


class Plaint(AbstractGeneratedCaseDocument):
    pass


class WritOfExecutionTemplate(AbstractBaseModel, WhoDidItMixin):
    plaint = models.ForeignKey(
        to='Plaint',
        verbose_name=_('plaint'),
        on_delete=models.PROTECT
    )

    def get_poa1_from_plaint(self):
        if (self.plaint.power_of_attorney is not None
                and self.plaint.case.plaintiff_representative == self.plaint.power_of_attorney.relative_person):
            poa = self.plaint.power_of_attorney
        else:
            poa = None
        return poa

    def get_poa2_from_plaint(self):
        # The same as for the first power of attorney
        if (self.plaint.power_of_attorney_2 is not None
                and self.plaint.case.plaintiff_representative == self.plaint.power_of_attorney_2.relative_person):
            poa = self.plaint.power_of_attorney_2
        else:
            poa = None
        return poa

    power_of_attorney = models.ForeignKey(
        verbose_name=_('power of attorney'),
        to='ImportedDocument',
        on_delete=models.PROTECT,
        #null=True,
        #blank=True,
        related_name='+',
        default=get_poa1_from_plaint,
    )

    power_of_attorney_2 = models.ForeignKey(
        verbose_name=_('power of attorney') + ' 2',
        to='ImportedDocument',
        on_delete=models.PROTECT,
        null=True,
        blank=True,
        related_name='+',
        default=get_poa2_from_plaint
    )

Модель администратора:

class WritOfExecutionTemplateAdminInline(admin.TabularInline):
    model = WritOfExecutionTemplate


class PlaintAdmin(admin.ModelAdmin):
    inlines = (
        WritOfExecutionTemplateAdminInline,
    )

Сообщение об ошибке:

get_poa1_from_plaint () отсутствует 1 обязательный позиционный аргумент: 'self'

Как правильно сделать то, что мне нужно?

...