Как вернуть значение из пользовательского поиска в базе данных на основе значения модели в Django admin list_display? - PullRequest
0 голосов
/ 28 апреля 2020

Много раз искал inte rnet, пробовал много решений, но он не работал.

У меня есть эти модели.

models.py

class Cadastro(models.Model):
    id_cadastro = models.AutoField(primary_key=True)
    categoria_tipo = models.CharField("Categoria", max_length=50, null=True)
    chave = models.CharField("Chave", max_length=50, null=False, blank=False)
    valor = models.CharField("Valor", max_length=50, null=False, blank=False)
    escricao_valor_cadastro = models.TextField("Descrição / Observação", blank=True, null=True)

    class Meta:
        verbose_name_plural = "Cadastros"

    def __str__(self):
        return self.valor


class ClasseCNJ(models.Model):

    cod_item = models.IntegerField(primary_key=True)
    tipo_item = models.CharField(max_length=1)
    nome_item = models.CharField(max_length=100)

    class Meta:
        managed = False
        db_table = 'itens'

    def __str__(self):
        return self.nome_item


class ElementoAutomacao(models.Model):
    id_automacao = models.AutoField(primary_key=True)
    elemento_automacao = models.ForeignKey('Elemento', on_delete=models.CASCADE, verbose_name="#Elemento", related_name='elemento_automacao', blank=False)
    tipo_item = models.ForeignKey('Cadastro', on_delete=models.SET_NULL, related_name='tipo_item', null=True, blank=True,
                                limit_choices_to={'chave': 'DEST'}, verbose_name="Item Tipo")
    item_codigo = models.CharField(max_length=10, blank=True, null=True, verbose_name="#Código")

    class Meta:
        verbose_name_plural = 'Regras de Automação'

    def __str__(self):
        return self.elemento_automacao.nome_elemento

    def get_item_cnj_desc(self, obj):

        if obj.tipo_item == "Movimento":
            descr_cnj = ClasseCNJ.objects.get(pk=obj.item_codigo, tipo_item='M')
        elif obj.tipo_item == "Classe":
            descr_cnj = ClasseCNJ.objects.get(pk=obj.item_codigo, tipo_item='C')
        elif obj.tipo_item == "Assunto":
            descr_cnj = ClasseCNJ.objects.get(pk=obj.item_codigo, tipo_item='A')
        else:
            descr_cnj = " - "

        return descr_cnj
        get_item_cnj_desc.short_description = 'Descrição'

Модель Cadastro - это обобщенная таблица c, в которой я храню данные значения ключа для заполнения множества списков.

ElementoAutomacao имеет поле tipo_item , которое указывает на Cadastro, фильтруя параметры , поэтому он может иметь поля "Movimento", "Classe" и "Assunto" и item_codi go, в которых хранится число.

ClasseCNJ - неуправляемая модель. Я использую его, чтобы получить описание, связанное с парой tipo_item - item_codi go модели ElementoAutomacao.

admin.py

@admin.register(ElementoAutomacao)
class ElementoAutomacaoRegister(admin.ModelAdmin):
    list_display = ('elemento_automacao','tipo_item','operacao','item_codigo','get_item_cnj_desc')

Но когда я делаю это, я получаю эту ошибку:

get_item_cnj_desc() missing 1 required positional argument: 'obj'

Чего мне не хватает?

1 Ответ

0 голосов
/ 01 мая 2020

Основываясь на комментарии @schwobaseggl, я внес некоторые изменения и заработал.

В model.py у меня теперь есть:

class ElementoAutomacao(models.Model):
    id_automacao = models.AutoField(primary_key=True)
    elemento_automacao = models.ForeignKey('Elemento', on_delete=models.CASCADE, verbose_name="#Elemento", related_name='elemento_automacao', blank=False)
    tipo_item = models.ForeignKey('Cadastro', on_delete=models.SET_NULL, related_name='tipo_item', null=True, blank=True,
                                limit_choices_to={'chave': 'DEST'}, verbose_name="Item Tipo")
    item_codigo = models.CharField(max_length=10, blank=True, null=True, verbose_name="#Código")

    class Meta:
        verbose_name_plural = 'Regras de Automação'

    def __str__(self):
        return self.elemento_automacao.nome_elemento

    def get_item_cnj_desc(self):

        if self.tipo_item.valor == 'Movimento':
            descr_cnj = ClasseCNJ.objects.get(pk=self.item_codigo, tipo_item='M').nome_item
        elif self.tipo_item.valor == "Classe":
            descr_cnj = ClasseCNJ.objects.get(pk=self.item_codigo, tipo_item='C').nome_item
        elif self.tipo_item.valor == "Assunto":
            descr_cnj = ClasseCNJ.objects.get(pk=self.item_codigo, tipo_item='A').nome_item
        else:
            descr_cnj = " -sa "

        return descr_cnj

и в admin.py

@admin.register(ElementoAutomacao)
class ElementoAutomacaoRegister(admin.ModelAdmin):
    list_display = ('elemento_automacao','tipo_item','operacao','item_codigo','get_item_cnj_desc')

    def get_item_cnj_desc(self,obj):
       return obj.get_item_cnj_desc()

    get_item_cnj_desc.short_description = 'Descrição Item'  # Renames column head

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...