Как установить значение поля (которое имеет отношение к форме, но не основано непосредственно на той же модели) в форме (модели), когда оно отображается в админке?
Вот упрощенная версия того, что у меня есть (мое настоящее приложение / модель / и т. Д. Более сложное):
- A
building
имеет много room
s
- A
room
имеет много частей equipment
Модель:
#spaces/models.py
from django.db import models
class Building(models.Model):
name=models.CharField(max_length=32)
def __unicode__(self):
return self.name
class Room(models.Model):
number=models.CharField(max_length=8)
building=models.ForeignKey(Building)
def __unicode__(self):
return self.number
class Equipment(models.Model):
tech = models.CharField(max_length=64)
room = models.ForeignKey(Room)
def __unicode__(self):
return self.tech
При добавлении или редактировании части оборудования было бы неплохо иметь возможность ограничить выбор room
(построением). Это я могу сделать: я добавляю поле building
в ModelForm, а затем, когда пользователь изменяет его, бит JQuery в файле шаблона динамически обновляет список room
s. admin.py
часть выглядит так:
#spaces/admin.py
from demo.spaces.models import Building, Room, Equipment
from django.contrib import admin
from django import forms
class EquipmentForm(forms.ModelForm):
class Meta:
model = Equipment
building = forms.ModelChoiceField(Building.objects)
class EquipmentAdmin(admin.ModelAdmin):
form = EquipmentForm
admin.site.register(Equipment, EquipmentAdmin)
admin.site.register(Building)
admin.site.register(Room)
При добавлении нового фрагмента equipment
все это работает нормально - мой код JQuery отображает -----
до тех пор, пока не будет выбрано здание, после чего раскрывающийся список для поля room
будет включен и заполнен кнопкой соответствующие room
s для этого здания.
Проблема: при отображении существующего элемента оборудования (demo.com/admin/spaces/equipment/12/
) или если форма добавления не проверяется, поле Room
правильно отображает room
- но building
поле уничтожено. В экземпляре формы существует значение внешнего ключа equipment.room
, и администратор автоматически устанавливает для этого поля значение room
, но я должен установить значение поля building
.
Я могу получить значение без проблем, поскольку в init формы легко проверить, является ли он экземпляром, а затем вернуться обратно, чтобы получить значение:
def __init__(self, *args, **kwargs):
super(EquipmentForm, self).__init__(*args, **kwargs)
if 'instance' in kwargs:
building_value = kwargs['instance'].room.building
Но что мне делать с этим значением, чтобы поле отображало его? Единственное, что я еще не пробовал, это добавить больше кода в мой шаблон, чтобы использовать Jquery для получения значения и установки его в конце, но я бы предпочел, чтобы JavaScript на странице не попадал в базу данных для отображения рисунков. значение, так как кажется, что это должно быть сделано при визуализации формы ...
Есть мысли? Спасибо за помощь!