Django Admin: Como adiciono um campo de modelo não relacionado a uma página de alteração/adição de modelo?

StackOverflow https://stackoverflow.com/questions/2853362

  •  27-09-2019
  •  | 
  •  

Pergunta

Eu tenho os seguintes modelos:

class Foo(models.Model):
    field1 = models.IntegerField()
    ...

class Bar(models.Model):
    field1 = models.IntegerField()
    ...

class Foo_bar(models.Model):
    foo = models.ForeignKey(Foo)
    bar = models.ForeignKey(Bar)
    ...

No administrador, eu quero para que, na página Alterar/Adicionar Foo, você possa especificar um objeto de barra e, no Salvar, eu quero criar um objeto Foo_bar para representar o relacionamento. Como posso fazer isso através da personalização do site de administrador/ModelAdmins? Observe que a inline não é exatamente o que eu preciso, porque não há um relacionamento de chave estrangeira explícita entre Foo e Bar. E segundo, na verdade não quero editar objetos de barra, só quero escolher entre os que estão no sistema.

Obrigado.

Foi útil?

Solução

Tem certeza que você não quer apenas um ManyTomanyfield? No administrador, isso se manifestaria como uma lista de seleções múltiplas de Bar objetos. Veja a parte de seleção de grupo do administrador para User.

Se você precisar de dados adicionais anexados ao relacionamento, você poderia use um through parâmetro:

class Foo(models.Model):
    field1 = models.IntegerField()
    bars = models.ManyToManyField("Bar", related_name="foos", through="Foo_bar")

Você precisará adicionar foo_bar ao administrador para editar esses parâmetros adicionais no admin.

Outras dicas

Eu posso pensar em duas possibilidades:

  1. Você pode criar um formulário personalizado para o seu Foo modele e adicione um campo contendo o Bar.objects.all() Queryset para ele. Em seguida, substitua o padrão do ModelAdmin save_form() Método para criar um novo Bar instância ao salvar o objeto.

  2. Você pode criar uma classe de campo personalizada e adicioná -la Foo Modelo e classifiquem essa funcionalidade por meio de um sinal ´SPost_Save` ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top