Django ModelChoiceField Issue - PullRequest
       5

Django ModelChoiceField Issue

0 голосов
/ 17 марта 2020

У меня следующая ситуация, у меня довольно большая устаревшая модель (которая, тем не менее, хорошо работает), и мне нужно одно из ее полей в качестве отдельного раскрывающегося списка для одной из моих форм:

Старая таблица:

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 правильный выбор. Этот выбор не является одним из доступных вариантов. Ошибка в формах. Есть идеи ??

...