загрузка изображения в базу данных с использованием моделей в django - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь загрузить изображение с формой модели, используя шаблон пользователя, в базу данных, и оно не работает, но оно работает со страницей администратора, я получаю все остальные данные, кроме изображения, код ниже, я знаю, что это не так отлично, но я расстраиваюсь, и я надеюсь, что кто-то может помочь, особенно с моими views.py Большое спасибо. Заранее спасибо!

Models.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)

forms.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']

views.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})

Ответы [ 2 ]

1 голос
/ 18 марта 2020

может быть, вы забыли поставить enctype в теге формы, сделайте это

<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form}}
    <input type="submit" class="btn btn-success" value="Submit">
 </form>
0 голосов
/ 18 марта 2020

В форме HTML обязательно должен быть правильно установлен атрибут enctype = "multipart / form-data". В противном случае request.FILES будет пустым. Вы можете прочитать это в официальной документации .

код шаблона:

            <form method="POST" action="" enctype="multipart/form-data">
                {% csrf_token %}
                {{ form.as_p }}
              <button type="submit" class="btn btn-primary btn-user btn-block">
              Submit
            </button>
            </form>
...