У меня следующая ситуация, у меня довольно большая устаревшая модель (которая, тем не менее, хорошо работает), и мне нужно одно из ее полей в качестве отдельного раскрывающегося списка для одной из моих форм:
Старая таблица:
class SummaryView(models.Model):
...
Period = models.CharField(db_column='Period', max_length=10, blank=True, null=True)
...
def __str__(self):
return self.Period
class Meta:
managed = False # Created from a view. Don't remove.
db_table = 'MC_AUT_SummaryView'
Внутренняя модель:
class BillCycle(models.Model):
...
Name = models.CharField(max_length=100, verbose_name='Name')
Period = models.CharField(max_length=10, null=True, blank=True)
Version = models.FloatField(verbose_name='Version', default=1.0)
Type = models.CharField(max_length=100, verbose_name='Type', choices=billcycle_type_choices)
Association = models.ForeignKey(BillCycleAssociation, on_delete=models.DO_NOTHING)
...
def __str__(self):
return self.Name
Поскольку я не хочу подключать их через внешний ключ (так как SummaryView не управляется Django), я попробовал решение, которое Я уже использовал довольно много раз. В моих формах я создаю ModelChoiceField, который указывает на мою устаревшую модель:
class BillcycleModelForm(forms.ModelForm):
period_tmp = forms.ModelChoiceField(queryset=SummaryView.objects.values_list('Period', flat=True).distinct(),
required=False, label='Period')
....
class Meta:
model = BillCycle
fields = ['Name', 'Type', 'Association', 'period_tmp']
И, на мой взгляд, я пытаюсь перезаписать поле периода из моей внутренней модели с помощью ввода формы пользователя:
def billcycle_create(request, template_name='XXX'):
form = BillcycleModelForm(request.POST or None)
data = request.POST.copy()
username = request.user
print("Data:")
print(data)
if form.is_valid():
initial_obj = form.save(commit=False)
initial_obj.ModifiedBy = username
initial_obj.Period = form.cleaned_data['period_tmp']
initial_obj.Status = 'Creating...'
print("initial object:")
print(initial_obj)
form.save()
....
Пока все хорошо:
- Раскрывающийся список отображается правильно
- В моем операторе печати в представлении («данные») я вижу, что нужная информация есть: 'Type': ['Create / Delta'], 'Association': ['CP'], 'period_tmp': ['2019-12']
Тем не менее я получаю Select правильный выбор. Этот выбор не является одним из доступных вариантов. Ошибка в формах. Есть идеи ??