Django: acessando a instância do modelo a partir do ModelAdmin?
Eu tenho um modelo para pedidos em um aplicativo de loja virtual, com uma chave primária de incremento automático e uma chave estrangeira, já que os pedidos podem ser divididos em vários pedidos, mas a relação com o pedido original deve ser mantid
class Order(models.Model):
ordernumber = models.AutoField(primary_key=True)
parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
# .. other fields not relevant here
Registrei uma classe OrderAdmin no site de administração. Para a visualização de detalhes, incluíparent_order
nofieldsets
attribute. Obviamente, por padrão, isso lista todos os pedidos em uma caixa de seleção, mas esse não é o comportamento desejado. Em vez disso, para pedidos que não têm um pedido pai (ou seja, não foram divididos de outro pedido;parent_order
é NULL / Nenhum), nenhum pedido deve ser exibido. Para pedidos que foram divididos, isso deve exibir apenas o pedido de mãe solteir
Existe um novo método ModelAdmin disponível,formfield_for_foreignkey
, isso parece perfeito para isso, pois o conjunto de consultas pode ser filtrado dentro dele. Imagine que estamos olhando para ele, a exibição detalhada do pedido nº 11234, que foi dividido do pedido nº 11208. O código está abaixo de
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'parent_order':
# kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
return db_field.formfield(**kwargs)
return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
A linha comentada funciona quando executada em um shell Python, retornando um conjunto de consultas de item único contendo o pedido nº 11208 para o nº 11234 e todos os outros pedidos que possam ter sido separados del
Certamente, não podemos codificar o número do pedido lá. Precisamos de uma referência aoordernumber
campo da instância do pedido cuja página de detalhes estamos vendo. Como isso
kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)
Não encontrei nenhuma maneira de substituir ????? com uma referência à instância "atual" do pedido, e eu me aprofundou bastante.self
dentroformfield_for_foreignkey
refere-se à instância ModelAdmin e, embora isso tenha ummodel
, não é a instância do modelo de pedido (é uma referência ModelBase; self.model () retorna uma instância, mas seu número de ordem é Nenhum
ma solução pode ser extrair o número do pedido de request.path (/ admin / orders / order / 11234 /), mas isso é realmente feio. Eu realmente gostaria que houvesse uma maneira melhor.