首页 > 解决方案 > 每当我尝试在没有 img Django 的情况下发布时显示错误

问题描述

我正在尝试创建一个社交媒体,但是每当我尝试发布一些没有图像字段的帖子时,它都会向我抛出一个错误,说“ 'post_img' 属性没有与之关联的文件。 ”。当我发布带有图片的内容时效果很好,但我希望它像 Twitter 一样,您可以在其中发布博客和图片。所以我不知道发生了什么。

在此处输入图像描述

模型.py

from django.db import models
from django.utils import timezone
from django.contrib.auth import get_user_model
User = get_user_model()
from PIL import Image

# Create your models here.
class PostTag(models.Model):
    tag = models.CharField(max_length=10)

    def __str__(self):
        return self.tag

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField(null = True, blank=True)
    post_img = models.ImageField(upload_to = "posts_img", null = True, blank = True)
    pub_date = models.DateTimeField(default = timezone.now)
    post_tag = models.ForeignKey(PostTag, on_delete=models.SET_NULL, null= True,blank=True) 
    author = models.ForeignKey(User, on_delete= models.CASCADE)
    
    def __str__(self):
        return f"{self.title} / {self.author}"
    if post_img:
        def save(self,*args, **kwargs):
            super().save(*args, **kwargs)

            img = Image.open(self.post_img.path)

            if img.height > 600 or img.width > 600:
                output_size = (600, 600)
                img.thumbnail(output_size)
                img.save(self.post_img.path)

视图.py

from django.shortcuts import render,redirect
from django.contrib.auth.decorators import login_required
from .forms import PostCreateForm
from django.contrib import messages
# Create your views here.
@login_required(login_url="users:index")
def posts_view(request):
    form = PostCreateForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.author = request.user
        obj.save()
        messages.success(request, "Successfully Posted your Post")
        return redirect("posts:posts_view")
    else:
        form = PostCreateForm()
    context = {
        "form": form
    }
    return render(request, "posts.html", context)

标签: pythonpython-3.xdjango

解决方案


您的问题是这段特定的代码片段:

if post_img:
    def save(self,*args, **kwargs):
        ...

这显然不会像你想象的那样做。if 语句仅在声明/创建类时处理。因此,该 if 语句仅找到ImageField您已声明的内容,发现它是真实的,然后save永久覆盖。相反,您想在您正在编写的方法中移动此类逻辑

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField(null = True, blank=True)
    post_img = models.ImageField(upload_to = "posts_img", null = True, blank = True)
    pub_date = models.DateTimeField(default = timezone.now)
    post_tag = models.ForeignKey(PostTag, on_delete=models.SET_NULL, null= True,blank=True) 
    author = models.ForeignKey(User, on_delete= models.CASCADE)
    
    def __str__(self):
        return f"{self.title} / {self.author}"
    
    def save(self,*args, **kwargs):
        super().save(*args, **kwargs)
        if self.post_img: # Move if inside the method!
            img = Image.open(self.post_img.path)
            if img.height > 600 or img.width > 600:
                output_size = (600, 600)
                img.thumbnail(output_size)
                img.save(self.post_img.path)

推荐阅读