Django在管理页面中过滤查询集

xesrikrc  于 2023-05-08  发布在  Go
关注(0)|答案(1)|浏览(149)

我在简单的Django项目中有三个模型。我想过滤器的品牌版本,而在管理页面添加。我已经尝试了不同的方法,其中之一是在附加代码中。admin.py文件也喜欢它所显示的。有什么建议吗?

class Brand(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Version(models.Model):
    name = models.CharField(max_length=100)
    manufacturer = models.ForeignKey(Brand, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.name} ({self.manufacturer})"



class Car(models.Model):
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    version = models.ForeignKey(
        Version,
        on_delete=models.CASCADE,
        limit_choices_to=Q(manufacturer=OuterRef('manufacturer_id'))
    )
    year = models.PositiveIntegerField()
    color = models.CharField(max_length=50)
    mileage = models.PositiveIntegerField()

    def __str__(self):
        return f"{self.brand} {self.version} {self.year} {self.color}"```

class CarAdminForm(forms.ModelForm):
    class Meta:
        model = Car
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.instance:
            self.fields['version'].queryset = self.instance.brand.versions.all()

class CarAdmin(admin.ModelAdmin):
    form = CarAdminForm

admin.site.register(Car, CarAdmin)

这就是我尝试的方式,但没有成功。

z9smfwbn

z9smfwbn1#

如果你想在管理面板中过滤一些东西,你可以使用list_filter将其设置为包含你想要过滤的模型字段的列表或元组。您还可以使用__来跨越关系,例如

@admin.register(Version)
class VersionAdmin(admin.ModelAdmin):
       list_filter = ['brand']

相关问题