Пустое поле изображения в наборе форм недействительно и не показывает ошибок

Почему форма не валидна пустое поле изображения... попадают в базу данных пустые записи если я делаю 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)
Вернуться на верх