Поле идентификатора формы модели передается как ОБЯЗАТЕЛЬНОЕ поле

Сайт, который я создаю, несколько раз использует формы моделей. До сих пор проверка форм с использованием is_valid проходила гладко. Теперь новая модель, которую я создал, решила, что поле id (которое создается автоматически для форм модели) является обязательным полем. Я отображаю поля вручную в шаблоне и не отображаю поле идентификатора. До сих пор это не было проблемой ни для одной из моих моделей, поскольку она никогда не регистрировалась как обязательное поле. Однако с этой проблемной моделью, поскольку я не визуализирую поле, оно возвращается пустым и поэтому не проходит проверку.

Я понимаю, что могу решить проблему, визуализируя поле, но я хотел бы понять, что здесь происходит. Почему он решил, казалось бы, случайно, что идентификатор требуется?

Вот проблемная модель:

class Item(models.Model):
    budgetcatagory=models.ForeignKey(BudgetCatagory, on_delete=models.CASCADE)
    name=models.CharField(max_length=30)
    enName=models.CharField(max_length=30, default ="")
    detail=models.CharField(max_length=30)
    layout=models.CharField(max_length=30, default="normal")
    unit=models.CharField(max_length=30)
    unit_description=models.CharField(max_length=30, default="")
    unit_price=models.IntegerField(default=0)
    QTY=models.IntegerField(default=0)
    param1=models.CharField(max_length=30, blank=True)
    param2=models.CharField(max_length=30, blank=True)
    param3=models.CharField(max_length=30, blank=True)
    param4=models.IntegerField(default=0)
    parent=models.CharField(max_length=30, default = "0")
    cost_ave=models.IntegerField(default=0, blank=True)
    cost_min=models.IntegerField(default=0, blank=True)
    cost_max=models.IntegerField(default=0, blank=True)
    total_cost=models.IntegerField(default=0)
    choiceList=(
            ('choice1',param1),
            ('choice2',param2),
    )
    ItemChoice=models.CharField(
        max_length=10,
        choices=choiceList,
        default='',
    )
    objects=ItemManager()

    def __str__(self):
        return self.name

Вот как я заполняю форму перед отправкой в ​​шаблон:

else:
    #populate
    I=Item.objects.filter(budgetcatagory__user_id=U.id)
    C=BudgetCatagory.objects.filter(user_id=U.id)

    #initiate initial catagories and items for new user
    if (not I.exists()) or (not C.exists()):
        Item.objects.filter(budgetcatagory__user_id=U.id).delete()
        BudgetCatagory.objects.filter(user_id=U.id).delete()
        InitiateNewUser(U)
        I=Item.objects.filter(budgetcatagory__user_id=U.id)
        C=BudgetCatagory.objects.filter(user_id=U.id)
    FormsetItem=ItemFormSet(queryset=I)
    FormsetCat=CatFormset(queryset=C)

return render(request,'getdata/budgetmachine.html', {'FormsetItem':FormsetItem, 'FormsetCat':FormsetCat })

А вот как я заполняю форму из POST:

if request.method=='POST':
            #Save
            FormsetItem=ItemFormSet(request.POST,queryset=Item.objects.filter(budgetcatagory__user_id=U.id))
            FormsetCat=CatFormset(request.POST)
            if FormsetItem.is_valid():

Я ломал голову об этом в течение нескольких дней. Любая помощь будет оценена по достоинству. Спасибо

РЕДАКТИРОВАТЬ:

Аласдер, следуя вашему ответу, я автоматически отрендерил весь набор форм {{ formset }}, чтобы убедиться, что все необходимые поля будут отображены. Теперь он не проходит проверку по еще более странной причине:

 {'id': ['Select a valid choice. That choice is not one of the available choices.']}

Очевидно, я не настроил свой идентификатор в качестве поля выбора, поскольку я вообще его не настраивал. он генерируется автоматически. Я медленно схожу с ума! Любая помощь будет более чем приветствуется.


person Bigga    schedule 01.03.2018    source источник


Ответы (1)


Поле id обязательно для наборов форм модели, его необходимо включить в шаблон. Возможно, вы раньше использовали отдельные формы моделей там, где это не требовалось.

person Alasdair    schedule 01.03.2018
comment
Большое спасибо за ответ. Я безуспешно пытался найти информацию об этом в документации. Можете ли вы указать мне место, чтобы прочитать об этом? - person Bigga; 02.03.2018
comment
В документации для использование набор форм модели в шаблоне, в нем говорится: если вы [рендерите поля вручную] и не перебираете поля с помощью цикла {% for %}, вам нужно будет визуализировать поле первичного ключа< /я>. - person Alasdair; 02.03.2018
comment
Кроме того, стоит упомянуть, что добавление {{ id }} где-то в форму фактически добавляет скрытый ввод <input name="smth-0-id" value="123" id="id_smth-0-id" type="hidden"> - person Andriy; 16.09.2018
comment
Это сводило меня с ума в течение 2 дней, небольшой, но критический момент - person diek; 14.05.2019