Как сделать так, чтобы загружать несколько файлов в одной форме на Django? - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть форма продукта, в которой добавляется новый товар для продажи в моем проекте электронной коммерции, в нем есть заголовок, описание, цена, марка, размеры, и я хочу добавить область для размещения изображений продукта, я могу загрузить один файл с полем файла вформы, но мне нужно загрузить несколько файлов и вставить в другую модель файла отношений с моей моделью продукта (класс продукта получает изображения из другого связанного класса).Как я могу сделать это с одной формой?Я думаю, что я так близок к решению, но я не прав.

Я использовал модуль более качественных форм, но не смог.

model.py

from django.db import models
from django.db.models import F
from ckeditor.fields import RichTextField

class ProductImage(models.Model):
   product_id = models.ForeignKey("Product", on_delete = models.CASCADE, verbose_name = "Product")
   product_image = models.FileField(upload_to='product_images/')
   cover_image = models.BooleanField(default=False)
   upload_date = models.DateTimeField(auto_now_add = True, verbose_name="Upload Date")

class Product(models.Model):
   seller = models.ForeignKey("auth.User", on_delete = models.CASCADE, verbose_name = "Seller")
   category = models.ForeignKey("Category", on_delete = models.CASCADE, verbose_name = "Category Name")
   title = models.CharField(max_length = 50, verbose_name="Product Title")
   size = models.ForeignKey("Size", on_delete = models.CASCADE, verbose_name = "Size")
   color = models.ForeignKey("Color", on_delete = models.CASCADE, verbose_name = "Color")
   last_used_date = models.DateTimeField(verbose_name="Last Used Date")
   description = RichTextField()
   created_date = models.DateTimeField(auto_now_add = True, verbose_name="Created Date")
   product_image = models.ManyToManyField("ProductImage", verbose_name = "ProductImages")

Я не уверен, что это должно быть много полей?

forms.py

from django import forms
from .models import Product, Category, Size, Color, Brand, Shipping, Comission, ProductImage
from betterforms.multiform import MultiModelForm

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ["category","title", "description","price", "income", "active_product",]
        images = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

class ProductImageForm(forms.ModelForm):
    class Meta:
        model = ProductImage
        fields = ["cover_image","product_image"]


class ProductMultiForm(forms.ModelForm):
        form_classes = {
            'product': ProductForm,
            'images': ProductImageForm,
        }

Я только что попытался объединить два класса.

Это так сложно.

views.py

from django.shortcuts import render, HttpResponse, redirect, get_object_or_404
from .forms import ProductForm
from django.contrib import messages
from .models import Product, Category, Size, Color, Brand, Shipping, Comission, ProductImage
from .forms import ProductMultiForm
from django.views.generic import UpdateView, CreateView
from django.http import JsonResponse
from django.views import View

class ProductMultiForm(request):
    form = ProductMultiForm
    def form_valid(self, form):
        product = form['product'].save()
        images = form['images'].save(commit=False)
        product.seller = request.user
        product.save()

        images.save()
        messages.success(CreateView,"Product created successful!")
        return redirect("index")

        form = ProductMultiForm(request.POST or None, request.FILES or None)
        product = form.save(commit=False)
        images = form.save(commit=False)
        product.seller = request.user
        images.product_id = product.id
        product.save()
        images.save()
        messages.success(self,"Product created successful!")
        return redirect("index")

1 Ответ

0 голосов
/ 03 февраля 2019

Для этого вы должны использовать встроенные формы: https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/#inline-formsets

...