Сайт, который я создаю, несколько раз использует формы моделей. До сих пор проверка форм с использованием 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.']}
Очевидно, я не настроил свой идентификатор в качестве поля выбора, поскольку я вообще его не настраивал. он генерируется автоматически. Я медленно схожу с ума! Любая помощь будет более чем приветствуется.