Django ModelForm необязательное поле CharField выдает ошибки
У меня есть ModelForm для модели, которая имеет несколько файлов и с каждым файлом описание типа (что это за файл). Это поле описания в модели имеет CHOICES. Я установил эти поля загрузки файлов и описания как скрытые поля на форме, а не обязательные. Теперь загрузка файла работает, но описание выдает ошибку поля, написано, что заполнитель в выпадающем списке не является правильным выбором. Это правда, но поскольку оно не является обязательным, я бы хотел, чтобы оно просто не проходило валидацию, и я застрял на том, как это сделать.
Мои коды, немного сократил их для краткости.
models.py
class Dog(models.Model):
FILE_TYPE_CHOICES = [
('SB', 'Stamboom'),
('RB', 'Registratiebewijs'),
('SJP', 'SJP-diploma'),
('CDD', 'CDD-diploma'),
('WT', 'Workingtestdiploma'),
('MISC', 'Overig'),
]
dog_id = models.UUIDField(unique=True, default=uuid.uuid4)
file_1 = models.FileField(upload_to=user_directory_path, blank=True, validators=[extension_validator])
desc_1 = models.CharField(choices=FILE_TYPE_CHOICES, blank=True, max_length=5)
forms.py (Я исключил все эти поля из модели-кода выше, чтобы было более понятно, но это для того, чтобы продемонстрировать, что эти поля не являются обязательными. Если я выведу требуемый атрибут 'desc_1' в представлении, он также говорит false
class DogForm(ModelForm):
class Meta:
model = Dog
fields = ('stamboomnummer', 'stamboomnaam', 'date_of_birth', 'breed',
'sex', 'sire', 'dam', 'microchip', 'breeder', 'owner',
'file_1', 'desc_1')
required = ('stamboomnummer', 'stamboomnaam', 'date_of_birth', 'breed',
'sex', 'sire', 'dam', 'microchip', 'breeder', 'owner')
widgets = {'file_1': forms.HiddenInput(),
'desc_1': forms.HiddenInput(),
}
views.py
@login_required
def newdog(request):
file_opties = Dog.FILE_TYPE_CHOICES
if request.method == 'POST':
form = DogForm(request.POST, request.FILES)
if form.is_valid():
dog = form.save(commit=False)
if request.FILES.get('file_1'):
dog.file_1 = request.FILES['file_1']
dog.user = request.user
dog.save()
assign_perm('accounts.view_dog', request.user, dog)
assign_perm('accounts.change_dog', request.user, dog)
assign_perm('accounts.delete_dog', request.user, dog)
return redirect('accounts:profile')
else:
form = DogForm()
return render(request, 'accounts/add_dog.html', {'form': form,
'buttontitle': 'Opslaan',
'formtitle': 'Hond toevoegen',
'file_type': file_opties})
Теперь, form.is_valid() равно False, а ошибки формы следующие:
desc_1: Selecteer een geldige keuze. Type bestand is geen beschikbare keuze.
Что означает что-то вроде: Выберите допустимый вариант, Тип bestand (который является текстом-заполнителем в моей форме) не является допустимым вариантом.
Я попытался переопределить функцию clean-function, но поле не находится в очищенных данных (что логично, так как это не валидная опция), и я не знаю, как получить его раньше. Я думаю, что мне нужно определить пользовательское поле, но я не могу найти, как это сделать в modelform со скрытым входом :/ Любая помощь будет очень признательна :)
Ваша форма отправляет desc_1, поэтому где-то в вашем шаблоне есть вход name="desc_1", который имеет заполненное значение Тип bestand. blank=True означает, что значение можно оставить пустым. Поскольку ваше поле имеет choices и blank=True, представленное значение может быть либо пустым , либо одним из FILE_TYPE_CHOICES.
Вы говорите, что Type bestand является заполнителем для этого поля, но если бы вы отобразили это поле как скрытый ввод ({{ form.desc_1 }} поскольку у вас переопределен виджет), оно не имело бы и не должно иметь заполнителя.
Эквивалентом обычной формы будет:
<input type="hidden" name="desc_1" value="">
Где атрибут value либо остается пустым, либо заполняется одним из существующих вариантов, ничего другого.
Я также добавлю, что если вы отображаете desc_1 поле как <select> элемент, value опция placeholder также должна быть пустой.