Объект 'ModelChoiceField' не является итерируемым - вызов объектов из существующей Модели
Теряю волю к жизни здесь lol - может быть довольно очевидно, что я новичок в Django/Python.
Не могу понять, что здесь происходит, я вызываю объекты из модели, которая имеет значения в Django Admin, но каждый раз, когда я пытаюсь исправить одну вещь, она ломает другую.
Я хочу иметь возможность создавать новые записи из frontend, но я получаю эту ошибку при попытке миграции:
Ошибка стека
File "/usr/local/lib/python3.6/site-packages/django/forms/fields.py", line 784, in __init__
self.choices = choices
File "/usr/local/lib/python3.6/site-packages/django/forms/fields.py", line 801, in _set_choices
value = list(value)
TypeError: 'ModelChoiceField' object is not iterable
Пожалуйста, посмотрите мою модель ниже:
models.py
# Model
engineer_shifts = [
(0,'Shift 1'),
(1,'Shift 2'),
(2,'Shift 3')
]
class Engineer(models.Model):
engineer = models.CharField(max_length=200,default="John Smith",verbose_name="Engineer")
engineer_shift = models.IntegerField(choices=engineer_shifts,verbose_name="Shift")
def __str__(self):
return f"{self.engineer}"
class Meta:
verbose_name_plural = 'Engineers'
class CreateHandoff(models.Model):
handoff_pk = models.AutoField(primary_key=True)
handoff_date = models.DateField(auto_now_add=True,verbose_name="Handoff Date")
shift1_lead = models.IntegerField(choices=engineer_picker,verbose_name="Shift 1 Lead")
shift1_sec = models.IntegerField(choices=engineer_picker,verbose_name="Shift 1 Secondary")
def __str__(self):
return f"{self.handoff_date}"
class Meta:
verbose_name_plural = 'Handoffs'
# Form
engineer_picker = forms.ModelChoiceField(
queryset=Engineer.objects.all()
)
class CreateHandoffForm(forms.ModelForm):
shift1_lead = forms.ChoiceField(
label = "Select Shift 1 Lead",
choices = engineer_picker,
required = True
)
shift1_sec = forms.ChoiceField(
label = "Select Shift 1 Secondary",
choices = engineer_picker,
required = True
)
class Meta:
model = CreateHandoff
fields = ["shift1_lead","shift1_sec"]
Вы ищете ForeignKey, вы можете сделать ForeignKey для ссылки на запись модели, так:
class CreateHandoff(models.Model):
handoff_pk = models.AutoField(primary_key=True)
handoff_date = models.DateField(auto_now_add=True,verbose_name="Handoff Date")
shift1_lead = models.ForeignKey(Engineer, on_delete=models.CASCADE, related_name='lead_handoffs', verbose_name='Shift 1 Lead')
shift1_sec = models.ForeignKey(Engineer, on_delete=models.CASCADE, related_name='sec_handoffs', verbose_name='Shift 1 Secondary')
def __str__(self):
return f"{self.handoff_date}"
class Meta:
verbose_name_plural = 'Handoffs'
Для ModelForm вам не нужно указывать поля: Django автоматически сделает ModelChoiceField для них, так:
class CreateHandoffForm(forms.ModelForm):
class Meta:
model = CreateHandoff
fields = ['shift1_lead', 'shift1_sec']