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 также должна быть пустой.

Вернуться на верх