【问题标题】:Filter options in one to one field django admin一对一字段中的过滤选项 django admin
【发布时间】:2020-04-15 21:53:07
【问题描述】:

我有这两个模型

from django.db import models

def get_upload_path(instance, filename):
    return '{0}/{1}'.format(instance.imovel.id, filename)

# Create your models here.
class Imovel(models.Model):
    nome = models.CharField(max_length=50)
    descricao = models.CharField(max_length=800)
    area = models.IntegerField()
    quartos = models.SmallIntegerField(null=True, blank=True)
    banheiros = models.SmallIntegerField()
    disponivel_aluguel = models.BooleanField()
    disponivel_venda = models.BooleanField()
    valor_aluguel = models.DecimalField(max_digits=15, decimal_places=2)
    valor_venda = models.DecimalField(max_digits=15, decimal_places=2)
    valor_condominio = models.DecimalField(max_digits=15, decimal_places=2)
    valor_iptu = models.DecimalField(max_digits=15, decimal_places=2)
    capa = models.OneToOneField('ImagemImovel', related_name='capa', on_delete=models.DO_NOTHING, null=True, blank=True)

    def __str__(self):
        return self.nome

    class Meta:
        db_table = 'imovel'

class ImagemImovel(models.Model):
    imovel = models.ForeignKey(Imovel, related_name='imagens', on_delete=models.CASCADE)
    nomeImagem = models.CharField(max_length=20)
    imagem = models.ImageField(upload_to=get_upload_path)

    def __str__(self):
        return self.nomeImagem

    class Meta:
        db_table = 'imagemImovel'

我有房子,它是图片和一个名为“capa”的字段,用来说明哪一个是主要图片。 问题是当我通过 django admin 添加房子时,保存并返回选择主要的房子,它让我从其他房子中选择图像。如何过滤它以仅显示与该特定房屋相关的图像?

我的 django 管理文件

from django.contrib import admin
from .models import ImagemImovel, Imovel

# Register your models here.
class ImagemImovelAdmin(admin.TabularInline):
    model = ImagemImovel

class ImovelAdmin(admin.ModelAdmin):
    inlines = (ImagemImovelAdmin, )

admin.site.register(Imovel, ImovelAdmin)

【问题讨论】:

  • 我不太明白。在当前设置中,当您在管理面板中单击 Imovel 模型时,您应该能够看到关联的图像。能详细解释一下吗?
  • 当我在管理面板中时,由于 admin.py 中的“inlines = (ImagemImovelAdmin, )”,我可以在同一个地方添加房子和房子的图像,我想要的是过滤字段“capa”中的选项

标签: django django-rest-framework django-admin


【解决方案1】:

我更改了我的 ImovelAdmin 类,因此我可以使用 get_form 函数从模型中获取 id 并将其用于查询集的过滤器中

class ImovelAdmin(admin.ModelAdmin):
        inlines = (ImagemImovelAdmin, )
        id_for_formfield = None
        def get_form(self, request, obj=None, **kwargs):
            if obj:
                self.id_for_formfield = obj.id
            return super(ImovelAdmin, self).get_form(request, obj, **kwargs)
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == "capa" and self.id_for_formfield is not None:
                kwargs["queryset"] = ImagemImovel.objects.filter(imovel=self.id_for_formfield)
            return super(ImovelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    
    admin.site.register(Imovel, ImovelAdmin)

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 2011-03-14
    • 2019-03-22
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 2012-04-28
    • 2022-08-14
    相关资源
    最近更新 更多