javascript - 为什么我的“如果 project_form.is_valid() 和 p_formset.is_valid()”不起作用?
问题描述
所以我一直在尝试在我的网站上实现一个功能,以便能够在其中发布多张图片。我不知道为什么如果我为 project_forms.is_valid() 和 p_formset.is_valid() 都做一个 if 语句,我的代码就不起作用。但是,如果它只是其中之一,它们就可以正常工作。
我没有任何错误弹出它只是它没有做它应该做的事情。没有图像或帖子进入我的数据库。
我实现多张图片上传的方式是为帖子和多张图片上传设置一个单独的表格,但使用外键链接。
这是我的代码:
视图.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)
模型.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)
由于一个单独的问题,外键的变量被注释掉了。我试图通过尝试解决这个问题来解决它,以便事情可以进入我的数据库。
表格.py
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',)
基本上传.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)
推荐阅读
- c# - 如何从 Xamarin 的 Sqlite 和列表中删除项目
- javascript - 我需要 jQuery 才能让 Google 跟踪代码管理器工作吗?与 AngularJs 一起使用
- java - 2个类似的java枚举和一个方法,决定从哪个枚举中选择值
- java - 在 java 中发送之前的 SAML 请求和签名请求
- yii2 - 使用yii2的家谱图
- laravel - 用不同的数据更新同一张表上的多条记录
- ruby - batch file - running an installer that appends to the PATH and the running that new application from the bat
- javascript - 如何使用javascript修剪单词之间和逗号后的空格
- e2e-testing - 为什么我无法在 Chrome (cypress) 中以新问题形式显示可用的里程碑?
- azure - 保护 Azure 云服务配置中的敏感信息