首页 > 解决方案 > 为什么我的“如果 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>"
          )
        }
      }
    });

  });

标签: javascriptpythondjango

解决方案


我认为您需要将您的函数分成两部分,第一个将呈现表单,第二个将回答 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)

推荐阅读