Ошибка при создании записи в БД. Django Forms. ImageField
Происходит ошибка: Обязательное поле.
Views.py:
class CreateFile(DataMixin, CreateView):
form_class = AddFileForm
template_name = 'filehost/add_file.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
c_def = self.get_user_context(title='Добавление файла')
return JoinDicts(context, c_def)
Urls.py:
from django.urls import path, re_path
from django.views.decorators.cache import cache_page
from .views import *
urlpatterns = [
path('', cache_page(0)(FilesHostHome.as_view()), name='filehost'),
path('c/<slug:slug>/', cache_page(0)(ShowFilesCategory.as_view()), name='filehost-category'),
path('f/<slug:slug>/', cache_page(0)(ShowFile.as_view()), name='filehosted'),
path('l/', cache_page(0)(CreateFile.as_view()), name='file-upload'),
path('link/<slug:slug>/', DownloadFile, name='file-download'),
]
Models.py:
from django.db import models
from django.urls import reverse
class File(models.Model):
title = models.CharField(max_length=255, verbose_name='Заголовок')
slug = models.SlugField(max_length=127, unique=True, db_index=True, verbose_name='URL')
description = models.TextField(blank=True, verbose_name='Содержание')
image = models.ImageField(upload_to="photos/%Y/%m/%d/", default='fileshosted/default/image.jpg', verbose_name='Фотография')
file = models.FileField(
upload_to='fileshosted/%Y/%m/%d/',
# validators=[FileExtensionValidator(allowed_extensions=['mp4'])],
verbose_name='Файл'
)
time_create = models.DateTimeField(auto_now_add=True, verbose_name='Время создания')
time_update = models.DateTimeField(auto_now=True, verbose_name='Время последнего изменения')
is_published = models.BooleanField(default=True, verbose_name='Опубликовано')
cat = models.ForeignKey('FileCategory', on_delete=models.PROTECT, default=1, verbose_name='Категория')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('filehosted', kwargs={'slug': self.slug})
class Meta:
verbose_name = 'Файл на хостинг'
verbose_name_plural = 'Файлы на хостинг'
ordering = ['-time_create', 'title']
class FileCategory(models.Model):
name = models.CharField(max_length=127, null=False, db_index=True, verbose_name="Название")
slug = models.SlugField(max_length=127, unique=True, db_index=True, verbose_name='URL')
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('filehost-category', kwargs={'slug': self.slug})
class Meta:
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
ordering = ['id']
Forms.py:
from django import forms
from .models import *
from women.textedit import slugify_ru
class AddFileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class Meta:
model = File
fields = ['title', 'description', 'image', 'file', 'cat']
widgets = {
'title': forms.TextInput(attrs={'class': 'form-input'}),
'description': forms.Textarea(attrs={'cols': '60', 'rows': 10}),
}
def save(self, *args, **kwargs):
self.fields['slug'] = slugify_ru(self.fields['title'])
self.fields['is_published'] = True
super(AddFileForm, self).save(*args, **kwargs)
Создание файла HTML:
{% extends 'filehost/base.html' %}
{% block content %}
<h1>{{title}}</h1>
<form action="{% url 'file-upload' %}" method="post">
{% csrf_token %}
<div class="form-error">{{ form.non_field_errors }}</div>
{% for f in form %}
<div class="form-error">{{f.errors}}</div>
<p><label class="form-label" for="{{ f.id_for_label }}">{{f.label}}</label>{{f}}</p>
{% endfor %}
<button type="submit">Добавить</button>
</form>
{% endblock %}
При нажатии на кнопку Добавить вылезает ошибка: Обязательное поле, даже если изображение выбрано. Как исправить? И как сделать так, чтобы когда изображение не указывалось оно бралось из папки по умолчанию?