Пустое поле изображения в наборе форм недействительно и не показывает ошибок
Почему форма не валидна пустое поле изображения... попадают в базу данных пустые записи если я делаю print (formset.is_valid) он возвращает мне true и создает 3 поля с пустым изображением, когда поле изображения пустое и должно вместо этого выдать ошибку.
просмотров
def product_gallery_create_view(request, id):
ProductGalleryFormset = formset_factory(FormCreateProductGallery, extra = 3)
product = Product.objects.get(id = id)
if request.method == "POST":
formset = ProductGalleryFormset(request.POST, request.FILES)
if formset.is_valid():
for form in formset:
if form.has_changed():
instance = form.save(commit = False)
instance.product = product
instance.save()
return redirect('home')
else:
formset = ProductGalleryFormset()
context = {'formset':formset}
return render(request, 'crud/product_gallery_create.html', context)
модель
class ProductGallery(models.Model):
product = models.ForeignKey(Product, on_delete = models.CASCADE, related_name = 'product_gallery')
image = models.FileField(upload_to ='galleria/')
form
class FormCreateProductGallery(forms.ModelForm):
class Meta:
model = ProductGallery
exclude = ['product']
html
{% if formset.errors %}
<div class="alert alert-danger">
{{ formset.errors }}
</div>
{% endif %}
<form method="post" enctype='multipart/form-data' class="notifica" autocomplete="off" novalidate>
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
<div class="d-flex align-item-center justify-content-between">
<div><small>img</small> {{ form.image }}</div>
</div>
<hr class="mt-4 mb-4">
{% endfor %}
<input type="submit" value="crea galleria" class="btn btn-info w-100">
</form>
Я думаю, это потому, что вы определили FileField() в атрибуте image. Попробуйте использовать это .
class ProductGallery(models.Model):
product = models.ForeignKey(Product, on_delete = models.CASCADE, related_name = 'product_gallery')
image = models.ImageField(upload_to ='galleria/' , default = "some_default_image.png")
А также поле изображения может быть пустым. Оно выдает ошибку только при просмотре непосредственно по ссылке, оно не выдает ошибку на шаблонах или формах .
Вы можете использовать сигналы django для проверки наличия или отсутствия изображения в сохраненном экземпляре. Или использовать валидацию в форме, чтобы сделать изображение обязательным полем .
class ProductGalleryFormset(forms.Form) :
image = forms.ImageField( required = True)
...
def clean_image(self) :
image = self.cleaned_data.get("image")
if not image :
raise forms.VaildationError("Image field is required !")
Вы получаете перенаправление, не видя ошибки, потому что вы не установили оператор else для метода if form.is_valid()
.
Вместо приведенной выше формы, которую вы используете, используйте эту :
Why form not valid an empty image field... fall into a database empty records if I do a print (formset.is_valid) it returns me true and creates 3 fields with empty image when the image field is empty and should instead give me an error.
views
def product_gallery_create_view(request, id):
ProductGalleryFormset = formset_factory(FormCreateProductGallery, extra = 3)
product = Product.objects.get(id = id)
if request.method == "POST":
formset = ProductGalleryFormset(request.POST, request.FILES)
if formset.is_valid():
for form in formset:
if form.has_changed():
instance = form.save(commit = False)
instance.product = product
instance.save()
return redirect('home')
else :
print(dict(formset.errors))
else:
formset = ProductGalleryFormset()
context = {'formset':formset}
return render(request, 'crud/product_gallery_create.html', context)