Удаление ссылок URLS.PY и VIEWS.PY
Я попытался сформулировать это конкретно, но дилемма заключается в следующем:
Изображение не загружается при добавлении slug на детальной странице, но прекрасно загружается в index.html.
post.image
- это код, который вы должны искать... работает в index.html, но не в post_detail... Что-то не так в view/urls... пробовал много комбинаций, но все еще не могу разобраться в хитросплетениях шаблонов url. Мне нужно, чтобы изображение в детали указывало на http://127.0.0.1:8000/static/placeholder_cake.PNG
, а не 'http://127.0.0.1:8000/carrot-cake/static/placeholder_cake.PNG
(в основном без slug)...
Спасибо всем, кто помогает!
index.html
<div class="col-md-8 mt-3 left">
{% for post in post_list %}
<div class="card mb-4">
<div class="card-body">
<img class="card-img-top" src="{{ post.image }}" alt="Card image cap">
<h2 class="card-title">{{ post.title }}</h2>
<p class="card-text text-muted h6">{{ post.author }} | {{ post.created_on}} </p>
<p class="card-text">{{post.content|slice:":200" }}</p>
<a href="{% url 'post_detail' post.slug %}" class="btn btn-primary">Read More →</a>
</div>
</div>
{% endfor %}
</div>
post_detail.html
{% extends 'base.html' %} {% block content %}
<!-- {% load static %} -->
<div class="container">
<div class="row">
<div class="col-md-8 card mb-4 mt-3 left top">
<div class="card-body">
<h1>{% block title %} {{ objest.title }} {% endblock title %}</h1>
<p class=" text-muted">{{ post.author }} | {{ post.created_on }}</p>
<!-- /carrot-cake/static/placeholder_cake -->
<img class="card-img-top" src="{{ post.image }}" alt="Card image cap">
<p class="card-text "><pre class="recipe">{{ object.content | safe }}</pre></p>
</div>
</div>
{% block sidebar %} {% include 'sidebar.html' %} {% endblock sidebar %}
</div>
</div>
{% endblock content %}
models.py
class Post(models.Model):
title = models.CharField(max_length=200, unique=True)
slug = models.SlugField(max_length=200, unique=True)
author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='blog_posts')
updated_on = models.DateTimeField(auto_now= True)
content = models.TextField()
created_on = models.DateTimeField(auto_now_add=True)
status = models.IntegerField(choices=STATUS, default=0)
image = models.ImageField(upload_to='static', null=True, blank=True) #creates folder called amiibo under the main media folder and uploads there
class Meta:
ordering = ['-created_on']
def __str__(self):
return self.title
views.py
class PostList(generic.ListView):
queryset = Post.objects.filter(status=1).order_by('-created_on')
template_name = 'index.html'
class PostDetail(generic.DetailView):
model = Post
template_name = 'post_detail.html'
urls.py
urlpatterns = [
path('', views.PostList.as_view(), name='home'),
path('<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
]
Объекты контекста, на которые вы ссылаетесь в шаблоне детализации, немного перепутаны.
Вы используете общий DetailView
, который по умолчанию добавляет конкретный объект в контекст как object
. Но вы пытаетесь ссылаться на него и как на объект, и как на пост. Поэтому постарайтесь сохранить его в виде object
;
{% extends 'base.html' %} {% block content %}
<!-- {% load static %} -->
<div class="container">
<div class="row">
<div class="col-md-8 card mb-4 mt-3 left top">
<div class="card-body">
<h1>{% block title %} {{ object.title }} {% endblock title %}</h1>
<p class=" text-muted">{{ object.author }} | {{ object.created_on }}</p>
<!-- /carrot-cake/static/placeholder_cake -->
<img class="card-img-top" src="{{ object.image }}" alt="Card image cap">
<p class="card-text "><pre class="recipe">{{ object.content|safe }}</pre></p>
</div>
</div>
{% block sidebar %} {% include 'sidebar.html' %} {% endblock sidebar %}
</div>
</div>
{% endblock content %}
Вы также ссылались на статический путь в своих примерах URL. Если вы загружаете что-то в поле в созданной вами модели, это не будет использовать ваш статический путь. Вместо него будут использоваться ваши медиа настройки.
Статические файлы включают css/javascript/изображения и т.д., а медиафайлы - это загружаемый пользователем контент.
И я только что заметил, что вы используете фильтр safe
. При использовании фильтров пробел не нужен.
Эта одна строка исправила то, что я пытался сделать:
<img class="card-img-top" src= "{% url 'home' %}{{ post.image }}" alt="Card image cap">
По сути, используется та же ссылка, что и в первом представлении/шаблоне (index), но из второго представления... (post_detail)