#python #django #django-forms
#python #django #django-формы
Вопрос:
У меня есть форма с текстовым полем и filefield в django. Это должно позволить пользователю либо вставить текст в это поле, либо загрузить файл. Если пользователь вставил текст в поле, мне не нужно проверять FileField.
Как мне сделать forms.FileField()
необязательным?
Ответ №1:
Если вы используете forms.FileField()
в forms.Form
производном классе, вы можете установить:
class form(forms.Form):
file = forms.FileField(required=False)
Если вы используете models.FileField()
и forms.ModelForm
присвоено этой модели, вы можете использовать
class amodel(models.Model):
file = models.FileField(blank=True, null=True)
То, что вы используете, зависит от того, как вы выводите форму и используете ли вы базовый ORM (т. Е. модель).
Комментарии:
1. Я читал в местах, которые
CharField
s не должны иметьnull=True
… посколькуFileField
s по сутиCharField
являются s, действительно ли это правильный путь?2. Не делайте этого
null=True
наFileField
s. Достаточно простоblank=True
. Как говорит @DMactheDestroyer, оно хранится какCharField
, чтоnull=True
приведет к путанице (другие значения будут сохранены какNULL
, а другие как""
(пустая строка)).
Ответ №2:
если вы хотите сделать это до того, как пользователь отправит форму, вам нужно будет сделать это с помощью javascript (jquery, mootools и т.д. Предлагают несколько быстрых методов для этого)
на стороне django вы могли бы сделать это чистым методом в форме. Это должно помочь вам начать, и вам нужно будет отобразить эти ошибки проверки в вашем шаблоне, чтобы пользователь мог их увидеть. Имя метода clean должно соответствовать имени поля формы с добавлением «clean_».
def clean_textBoxFieldName(self):
textInput = self.cleaned_data.get('textBoxFieldName')
fileInput = self.cleaned_data.get('fileFieldName')
if not textInput and not fileInput:
raise ValidationError("You must use the file input box if not entering the full path.")
return textInput
def clean_fileFieldName(self):
fileInput = self.cleaned_data.get('fileFieldName')
textInput = self.cleaned_data.get('textBoxFieldName')
if not fileInput and not textInput:
raise ValidationError("You must provide the file input if not entering the full path")
return fileInput
в шаблоне
{% if form.errors %}
{{form.non_field_errors}}
{% if not form.non_field_errors %}
{{form.errors}}
{% endif %}
{% endif %}