Администратор 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 для администратора, чтобы редактировать эти дополнительные параметры в администраторе.
Я могу думать о двух возможностях:
Вы можете создать собственную форму для вашего
Foo
модель и добавить поле, содержащееBar.objects.all()
запрос к нему. затем переопределить по умолчанию ModelAdminsave_form()
способ создать новыйBar
экземпляр при сохранении объекта.Вы можете создать собственный класс 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.