Как загрузить файл с помощью форм в 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()