Я новичок 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)