因此,我一直在尝试在我的网站上实施一项功能,以便能够在其中发布多张图片。我不确定为什么同时对project_forms.is_valid()和p_formset.is_valid()都执行if语句,但我的代码无法正常工作。但是,如果只是其中之一,它们就可以正常工作。
我没有出现任何错误,只是它没有按预期执行。没有图像或帖子进入我的数据库。
我实现多图片上传的方式是为帖子和多图片上传创建单独的表格,但使用外键链接。
这是我的代码:
views.py
def create_projects(request):
# Special case if the request method is not POST
project_form = ProjectsForm(request.POST, request.FILES)
p_formset = P_ImageForm(request.POST, request.FILES)
# Checks if the form is valid before save
if project_form.is_valid() and p_formset.is_valid():
instance = project_form.save(commit=False)
instance.user = request.user
instance.save()
p_photos = p_formset.save(commit=False)
p_photos.save()
data = {'is_valid': True, 'name': p_photos.p_file.name, 'url': p_photos.p_file.url}
return JsonResponse(data)
else:
data = {'is_valid': False}
context = {
'project_form': project_form,
'p_formset': p_formset,
}
return render(request, 'projects/forms.html', context)
models.py
from django.db import models
from django.utils import timezone
from django.forms import ModelForm
from django.utils.text import slugify
from django.utils.crypto import get_random_string
from django.conf import settings
from django.contrib.postgres.fields import ArrayField
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser
)
from PIL import Image
import os
DEFAULT_IMAGE_ID = 1
# Create your models here.
class Projects(models.Model):
title = models.CharField(max_length=30)
description = models.TextField(max_length=150)
publish_date = models.DateTimeField(auto_now=False, auto_now_add=True)
update_date = models.DateTimeField(auto_now=True, auto_now_add=False)
slug = models.SlugField(unique=True)
files = models.FileField(upload_to='files/', blank=True)
images = models.ImageField(upload_to='images/', height_field = 'img_height', width_field = 'img_width',blank=True)
img_height = models.PositiveIntegerField(default=600)
img_width = models.PositiveIntegerField(default=300)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
# Generates a random string
unique_string = get_random_string(length=32)
# Combines title and unique string to slugify
slugtext = self.title + "-" + "unique_id=-" + unique_string
self.slug = slugify(slugtext)
return super(Projects, self).save(*args, **kwargs)
def get_p_image_filename(instance, filename):
title = instance.p_post.title
slug_title = slugify(title)
return "post_images/%s-%s" % (slug_slug, filename)
class P_Images(models.Model):
p_file = models.ImageField(upload_to='images/', blank=None)
p_uploaded_at = models.DateTimeField(auto_now_add=True, auto_now=False)
#p_post = models.ForeignKey(Projects, on_delete=models.CASCADE, default=DEFAULT_IMAGE_ID)
由于一个单独的问题,外键变量已被注释掉。我正在尝试通过解决此问题来修复它,以便可以将其保存到我的数据库中。
表格
from django import forms
from .models import Projects, P_Images
class ProjectsForm(forms.ModelForm):
class Meta:
model = Projects
#file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))
fields = ('images','title', 'description',)
class P_ImageForm(forms.ModelForm):
#p_image = forms.ImageField(label='Image')
class Meta:
model = P_Images
fields = ('p_file',)
basic-upload.js
$(function () {
/* 1. OPEN THE FILE EXPLORER WINDOW */
$(".js-upload-photos").click(function () {
$("#fileupload").click();
});
/* 2. INITIALIZE THE FILE UPLOAD COMPONENT */
$("#fileupload").fileupload({
dataType: 'json',
done: function (e, data) { /* 3. PROCESS THE RESPONSE FROM THE SERVER */
if (data.result.is_valid) {
$("#gallery tbody").prepend(
"<tr><td><a href='" + data.result.url + "'>" + data.result.name + "</a></td></tr>"
)
}
}
});
});
我认为您需要将函数分成两部分,第一个将呈现表单,第二个将回答api调用。我认为您应该这样做,因为函数应该返回一种类型的内容,而在这里您有两种:JSON和HTML。我建议你这样做:
@require_http_methods(["GET"])
def get_create_form(request):
context = {
'project_form': ProjectsForm(),
'p_formset': P_ImageForm(),
}
return render(request, 'projects/forms.html', context)
@require_http_methods(["POST"])
def create_projects(request):
project_form = ProjectsForm(request.POST, request.FILES)
p_formset = P_ImageForm(request.POST, request.FILES)
# Checks if the form is valid before save
if project_form.is_valid() and p_formset.is_valid():
instance = project_form.save(commit=False)
instance.user = request.user
instance.save()
p_photos = p_formset.save(commit=False)
p_photos.save()
data = {
'is_valid': True,
'name': p_photos.p_file.name,
'url': p_photos.p_file.url
}
else:
data = {
'is_valid': False,
'errors': form.errors.as_json()
}
return JsonResponse(data)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句