Изображения не загружаются в django и показывают ошибку 404 - PullRequest
0 голосов
/ 08 марта 2020

Я новичок ie в django и делаю пробный блог для практики. Я получаю сообщение об ошибке в отношении загруженных изображений:

Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/media/default.jpg
Raised by:  django.views.static.serve
"E:\Django\boot\media\default.jpg" does not exist

файл default.jpg находится в правильном каталоге, но все еще получаю эту ошибку. Кроме того, если я загружаю изображение, я могу просмотреть его на django странице администратора, но оно не отображается на реальной веб-странице.

models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
from PIL import Image

class Post(models.Model):
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    pic = models.ImageField(default="default.jpg",upload_to="images")
    title = models.CharField(max_length=200)
    sub_title = models.CharField(max_length=100)
    date_posted = models.DateTimeField(default=timezone.now)
    content = models.TextField()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('detail',kwargs = {'pk':self.pk})

forms.py

from .models import Post
from django import forms

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ('title','sub_title','content','pic')

views.py

from django.shortcuts import render
from .models import Post
from .forms import PostForm
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import (
    ListView,
    DetailView,
    CreateView,
    UpdateView,
    DeleteView
)

class PostListView(ListView):
    model = Post
    template_name = "blog/index.html"
    context_object_name = "posts"

class PostDetailView(DetailView):
    model = Post

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    form_class = PostForm
    template_name = "blog/post_form.html"
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)


class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    fields = ('title','sub_title','content')
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

#Note that the if condition can't be replaced with "return self.request.user == post.author". It would show an error saying User doesn't have attribute author
    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        else:
            return False

class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model =Post
    success_url = "/"
    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        else:
            return False

post_form. html

{% load crispy_forms_tags %}
{% load static %}

{% block content %}
  <!-- Page Header -->
  <header class="masthead" style="background-image: url('{{ user.post.pic.url }}')">
    <div class="overlay"></div>
    <div class="container">
      <div class="row">
        <div class="col-lg-8 col-md-10 mx-auto">
          <div class="site-heading">
            <h1>Post Creation</h1>
            <span class="subheading">Some post</span>
          </div>
        </div>
      </div>
    </div>
  </header>
  <div class="container">
    <form method="post" enctype="multipart/form-data">
      {% csrf_token %}
      <fieldset>
        {{ form|crispy }}
      </fieldset>
      <input type="Submit" name="submit" value="submit" class="btn btn-outline-info">
    </form>
  </div>

{% endblock %}

settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,"staticfiles")

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,"media")

urls.py

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
...