首页 > 解决方案 > 在 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})

标签: djangodjango-modelsdjango-forms

解决方案


也许你忘了enctype输入表单标签,所以这样做

<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form}}
    <input type="submit" class="btn btn-success" value="Submit">
 </form>

推荐阅读