Объект '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']
Вернуться на верх