Как загрузить файл с помощью форм в django

У меня возникли проблемы с загрузкой файла изображения в мою базу данных. Вот код.

models.py

    from django.db import models
    from datetime import datetime


    class Product(models.Model):

        name = models.CharField(max_length=1000, blank=False, null=False)
        image = models.FileField()
        price = models.IntegerField(default=0, blank=False, null=False)
        stock = models.IntegerField(default=0, blank=False, null=False)

forms.py

    from django import forms
    from .models import Product


    class ProductCreationForm(forms.ModelForm):
        class Meta:
            model = Product
            fields = (
                "name",
                "image",
                "price",
                "stock",
            )
    

views.py

    from .models import Product
    from .forms import ProductCreationForm


    def product_create(request):
        form = ProductCreationForm()

        if request.method == "POST":
            form = ProductCreationForm(request.POST)

            if form.is_valid():
                name = form.cleaned_data['name']
                image = form.cleaned_data['image']
                price = form.cleaned_data['price']
                stock = form.cleaned_data['stock']


                item = Product.objects.create(name=name, image=image, price=price, 
                                                                    stock=stock)
                item.save()

                return redirect('product-view')

            else:
                messages.info(request, 'Invalid information entry!')
                return redirect('product-create')

        else:
            return render(request, "create.html", {"form": form})

create.html

    {% if user.is_authenticated %}

            <form method="post">
                {% csrf_token %}

                {% for message in messages %}
                    {{ message }}
                {% endfor %}

                {{ form.as_p }}

                <input type="submit", value="Done">
            </form>

    {% endif %}

settings.py

    STATIC_URL = 'static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')


    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

urls.py

    from django.conf.urls.static import static
    from django.conf import settings

    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
        urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Каждый раз, когда я создаю новый продукт на моей html-странице, сохраняется только название, цена и запас. Изображение остается пустым. Есть ли какой-то виджет, который нужно добавить в forms.py или что-то еще отсутствует

Pro first Вы используете ModelForm и Вам не нужно писать эту часть

            if form.is_valid():
                name = form.cleaned_data['name']
                image = form.cleaned_data['image']
                price = form.cleaned_data['price']
                stock = form.cleaned_data['stock']

                item = Product.objects.create(name=name, image=image, price=price, 
                                                                    stock=stock)
                item.save()

после is_valid() только добавьте файл в форму Вы можете получить доступ к нему из request.FILES затем сохраните его это будет выглядеть как

form = ProductCreationForm(data=request.POST, files=request.FILES)
if form.is_valid():
   form.save()
Вернуться на верх