python - 每当我尝试在没有 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)
解决方案
您的问题是这段特定的代码片段:
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)
推荐阅读
- reactjs - webpack 中的 ./ publicPath 是做什么的
- c# - 在 ASP.Net Core Web 应用程序(引导程序)中向导航栏添加下拉菜单
- heroku - Heroku 调度器不允许我使用免费的测功机进行调度
- svn - 让 SVN 忘记之前的冲突解决决定?
- python - shell 排序比较的计数
- time-series - 错误无法将频率从 365 更改为 52
- python - 查找三个相等字符串的功能不起作用
- java - 我无法添加两个 BigDecimal 对象
- java - 如何从位于新类中的静态方法更新位于其自己方法中的另一个类中的现有数组?
- python - 如何确定 3-D 射线穿过的第一个三角形(一组三角形中)?