django - 在 django 中使用 modelforms 将图像上传到数据库
问题描述
我正在尝试使用用户模板将带有模型表单的图像上传到数据库中,但它不起作用,但它与管理页面有关,我正在获取除图像之外的所有其他数据,代码在下面我知道它不是很好但我'我很沮丧,我希望有人能帮助我,尤其是我的意见。py 非常感谢。先感谢您!
模型.py
import os, random
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import pre_save
from django.utils import timezone as tz
from django.urls import reverse
from .utils import unique_slug_generator
def get_filename_and_ext(filename):
base_name = os.path.basename(filename)
name ,ext = os.path.splitext(base_name)
return name,ext
def upload_file_to(instance, filename):
new_filename = random.randint(1,29494923)
name, ext = get_filename_and_ext(
final_filename = '{new_filename}{ext}'.format(new_filename=new_filename, ext=ext)
return 'post/{new_filename}/{final_filename}'.format(new_filename=new_filename, final_filename=final_filename)
class Post(models.Model):
title = models.CharField(max_length=20)
slug = models.SlugField(blank=True, unique=True)
content = models.TextField()
time = models.DateTimeField(auto_now_add=True)
image = models.ImageField(upload_to=upload_file_to, null=True, blank=True)
auther = models.ForeignKey(User)
def get_absolute_url(self):
return reverse("posts:detail",kwargs={"slug":self.slug})
objects = AccountManager()
def __str__(self):
return self.title
def post_pre_save_reciver(sender, instance, *arg, **kwargs):
if not instance.slug :
instance.slug = unique_slug_generator(instance)
pre_save.connect(post_pre_save_reciver, sender = Post)
表格.py
from django import forms
from django.contrib.auth import get_user_model
# from . import models
from .models import upload_file_to, get_filename_and_ext, Post, Comment
from .utils import unique_slug_generator
class post_form(forms.ModelForm):
class Meta:
model = Post
fields = '__all__'
exclude = ['auther','slug']
视图.py
@login_required(login_url="/login")
def creat_post(request):
if request.method == 'POST' :
form = post_form(request.POST or None, request.FILES or None)
if form.is_valid() :
instance = form.save(commit=False)
instance.auther = request.user
instance.save()
return redirect("../")
else :
form = post_form()
return render(request, "account/Create_post.html",{'form': form})
解决方案
也许你忘了enctype
输入表单标签,所以这样做
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form}}
<input type="submit" class="btn btn-success" value="Submit">
</form>