загрузка изображений через form.py - PullRequest
0 голосов
/ 20 июня 2020

если я загружу изображение через панель администратора, изображение будет успешно загружено, оно появится в папке мультимедиа в каталоге моего проекта, который я указал в settings.py. но если я загружаю изображение через form.py как пользователь, все остальные поля сохраняются, кроме поля изображения. Я пробовал большинство решений по stackoverflow, не знаю, почему мой не работает.

во время отладки я сделал mainimage обязательным полем, поэтому он выдал эту ошибку: ValueError: Просмотр продуктов. views.products не вернул объект HttpResponse. Вместо этого он вернул None.

form.py


from django import forms
from django.utils.translation import gettext_lazy as _
from .models import Product

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'mainimage', 'category', 'preview_text',
                  'detail_text', 'price','Quantity']
        labels = {
            'name': _('Product name'),
        }
        help_texts = {
            'name': _('be specific eg Tomatoes, Rice'),
        }
        error_messages = {
            'name': {
                'max_length': _("This writer's name is too long."),
            },
        }

views.py


from django.shortcuts import render, redirect
from .form import ProductForm
from .models import Product
# Create your views here.
def products(request):
    if request.method == 'GET':
        form = ProductForm()
        return render(request, 'products/add_product.html',{'forms':form})
    else:
        # imagefield is different from other
        # fields and it needs to be handles properly
        # data fetched from imagefield would be stored
        # in request.FILES object.
        if request.method == 'POST':
            form = ProductForm(request.POST or None, request.FILES or None)
            if form.is_valid():
                name = form.cleaned_data.get('name')
                mainimage = form.cleaned_data.get('mainimage')
                category = form.cleaned_data.get('category')
                preview_text = form.cleaned_data.get('preview_text')
                detail_text = form.cleaned_data.get('detail_text')
                price = form.cleaned_data.get('price')
                Quantity = form.cleaned_data.get('Quantity')
                obj = Product.objects.create(
                    name = name,
                    mainimage = mainimage,
                    category = category,
                    preview_text = preview_text,
                    detail_text = detail_text,
                    price = price,
                    Quantity = Quantity
                )
                obj.save()


                # form.save()
                return redirect('/products/')
        else:
            form = ProductForm()
            return render(request, 'add_product.html', {'form': form})

add_product

{% extends "plugs/base.html" %}
{% load crispy_forms_tags %}

{% block content %}
<h4>Add a Product</h4>
<form action="#" method="post" autocomplete="off" enctype="multipart/form-data">
                    {% csrf_token %}
<!--                    {{form_store.store_name|as_crispy_field}}-->
                    <div class="col-md-3">
                            {{ forms.name|as_crispy_field }}

                        </div>
                    <div class="row">
                            <div class="col-md-4"  >
                            {{ forms.mainimage|as_crispy_field }}
                        </div>
                        <div class="col-md-3">
                          {{ forms.category|as_crispy_field }}
                        </div>

                        </div>
                    <div class="col-md-5">

                            {{ forms.preview_text|as_crispy_field }}
                        {{ forms.detail_text|as_crispy_field }}
<!--                        {{ forms.price|as_crispy_field }}-->

                        {{ forms.Quantity|as_crispy_field }}


                        </div>

                    <button type="submit" class="btn btn-success"><i class="fas fa-database"></i>Submit</button>
                </form>
{% endblock %}

settings.py

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

models.py

from django.db import models

# Create your models here.
class Category(models.Model):
    title = models.CharField(max_length= 300)
    primaryCategory = models.BooleanField(default=False)

    def __str__(self):
        return self.title

class Product(models.Model):
    mainimage = models.ImageField(upload_to='products/', blank=True)
    name = models.CharField(max_length=300)
    slug = models.SlugField(blank = True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    preview_text = models.TextField(max_length = 200, verbose_name='Preview Text')
    detail_text = models.TextField(max_length= 1000, verbose_name='Detail text')
    price = models.FloatField()
    Quantity = models.CharField(max_length=150, default='1 quantity')

    def __str__(self):
        return self.name

проект / urls.py

from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('plugs.urls')),
    path('products/', include('products.urls')),
    path('home/', include('cart.urls')),
    # path('products/', include('products.urls')),
]
urlpatterns += staticfiles_urlpatterns()
if settings.DEBUG:
    urlpatterns +=static(settings.MEDIA_URL,
                         document_root = settings.MEDIA_ROOT)

Ответы [ 3 ]

0 голосов
/ 20 июня 2020

Установлен ли ваш MEDIA_DIR в вашем settings.py?

MEDIA_DIR = os.path.join(BASE_DIR, '/static/media/')
0 голосов
/ 20 июня 2020

ValueError: просмотр products.views.products не вернул объект HttpResponse. Вместо этого он вернул None. Означает, что где-то в ваших представлениях вы не возвращаете ответ Http. Попробуйте сделать отступ последней строки вашего представления на том же уровне, что и все остальное. Это может решить

0 голосов
/ 20 июня 2020

ладно, лучше смени вид на

if request.method == 'POST':
            form = ProductForm(request.POST or None, request.FILES or None)
            if form.is_valid():
                instance = form.save(commit=False)
                instance.name = form.cleaned_data['name']
                instance.mainimage = form.cleaned_data['mainimage']
                instance.category = form.cleaned_data['category']
                instance.preview_text = form.cleaned_data['preview_text']
                instance.detail_text = form.cleaned_data.get['detail_text']
                instance.price = form.cleaned_data['price']
                instance.Quantity = form.cleaned_data['Quantity']
                instance.save()
                
...