Как сделать FileField в django необязательным?

#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 %}