一对一字段django admin中的过滤选项
Filter options in one to one field django admin
我有这2款
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)
我更改了 ImovelAdmin class,这样我就可以使用 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)
我有这2款
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)
我更改了 ImovelAdmin class,这样我就可以使用 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)