如何在 django-admin 上过滤模型

how to filter models on django-admin

我有两个模型:

class Contrato(models.Model):
    active= models.BooleanField(default=False, verbose_name="Activo?")
    .....

    def __str__(self,):
        return str(self.id) + '- ' + str(self.forcenedor)

class Fatura(models.Model):
    contrato = models.ForeignKey(Contrato, on_delete=models.CASCADE,verbose_name="Contrato")
    designação =  models. CharField(verbose_name="Designação",max_length=30)
    ..............

    def __str__(self,):
        return str(self.id)             

当我在我的 django-admin 中添加一个新的“Fatura”时,我只想显示“Contrato”在“active

上也是如此

这种类型的过滤器,我需要在我的管理文件中做还是我可以直接在我的模型文件中做?我该怎么做?

要过滤所有有效合同,您必须使用 Contrato 的对象管理器

active_contracts = Contrato.objects.filter(active=True)

您需要更新 admin.py 文件

from .models import Contrato
from django.contrib import admin
class ContratoAdmin(admin.ModelAdmin):

        def get_queryset(self, request):
        """Make a queryset for list of results.
        """
            qs = super().get_queryset(request)

            return qs.filter(active=True)

admin.site.register(Contrato, ContratoAdmin)

根据您的评论,您执行以下操作。 您需要覆盖 admin.py 文件中的 get_form 方法。

def get_form(self, request, obj=None, **kwargs):
    form.base_fields['contrato'].queryset = Contrato.objects.filter(active=True)
def get_form(self, request, obj=None, **kwargs):
    form = super(FaturaAdmin, self).get_form(request, obj=obj, **kwargs)
    form.base_fields['contrato'].queryset = Contrato.objects.filter(active=True)
    return form