Администратор Django: как добавить несвязанное поле модели на страницу изменения / добавления модели?

У меня есть следующие модели:

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)
    ...

В админке я хочу, чтобы на странице Foo change/add вы могли указать объект Bar, а при сохранении я хочу создать объект Foo_bar для представления отношения. Как я могу сделать это через настройку сайта администратора /ModelAdmins? Обратите внимание, что встраивание не совсем то, что мне нужно, потому что между foo и bar нет явного отношения внешнего ключа. И во-вторых, я на самом деле не хочу редактировать объекты панели, я просто хочу выбирать из тех, которые есть в системе.

Благодарю.

2 ответа

Решение

Вы уверены, что не хотите просто ManyToManyField? В админке это проявилось бы как список с множественным выбором Bar объекты. Посмотрите на часть выбора группы администратора для User,

Если вам нужны дополнительные данные, связанные с отношениями, вы можете использовать through параметр:

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

Вам необходимо добавить Foo_bar для администратора, чтобы редактировать эти дополнительные параметры в администраторе.

Я могу думать о двух возможностях:

  1. Вы можете создать собственную форму для вашего Foo модель и добавить поле, содержащее Bar.objects.all() запрос к нему. затем переопределить по умолчанию ModelAdmin save_form() способ создать новый Bar экземпляр при сохранении объекта.

  2. Вы можете создать собственный класс Field и добавить его к себе Foo моделировать и классифицировать эту функцию с помощью сигнала "post_save"...

Для тех, кто действительно хочет добавить несвязанное поле модели для добавления / изменения, используйте ModelChoiceField

from django import forms

class CustomForm(forms.Form):
    foo = forms.ModelChoiceField(queryset=Foo.objects.all())
    bar = forms.ModelChoiceField(queryset=Bar.objects.all())

Затем просто добавьте форму в add_form/change_form ModelAdmin.

Другие вопросы по тегам