Я использую грязные формы
Модель
class CadreAck(models.Model):
cadre = models.ForeignKey('common.Cadre',on_delete=models.CASCADE,null=True,blank=True)
dtg = models.DateTimeField(verbose_name='Datetime',null=True,blank=True)
comments = models.TextField(null=True,blank=True)
attachment = models.FileField(upload_to=cadre_ack_path,blank=True)
Форма
class CadreAckForm(forms.ModelForm):
class Meta:
model = common_models.CadreAck
exclude = ['dtg']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.add_input(Submit('submit', 'Submit'))
self.helper.form_method = 'POST'
Шаблон
{% extends "cadreportal/base.html" %}
{% load crispy_forms_tags %}
{% load render_table from django_tables2 %}
{% load querystring from django_tables2 %}
{% load bootstrap4 %}
{% block content %}
<h1> {{ header }} </h1><hr>
{% if sub_header %} <h3>{{ sub_header }}</h3><hr> {% endif %}
{% if sub_sub_header %} <h3>{{ sub_sub_header }}</h3><hr> {% endif %}
{% if form%}
<h3> {{ form_header }} </h3>
{% crispy form %}
{% endif %}
{% endblock content %}
Поле выбора файла закрывает установите флажок загрузки вложения и снимите флажок (см. фрагмент) Вывод