【问题标题】:Django 2.1 template img src is not workingDjango 2.1 模板 img src 不工作
【发布时间】:2019-06-26 17:36:13
【问题描述】:

我想在我的 Django 模板文件上显示图像,但图像已损坏。所有图像都上传到媒体静态文件中,但它们无法显示在我的模板文件中,当我转到 Django 管理页面并单击图像链接时,这是我得到的错误消息: Page not found(404)

谁能帮我解决这个问题?提前致谢。

这里是模板文件“post_detail.html”:

<div class="row">

    <div class="col-6">

        {% if instance.image %}

        <img src="{{ instance.image.url }}" alt="image" class="img-thumbnail">

        {% endif %}

        <div class="post-detail-item text-justify"><p> {{ instance.get_markdown }} </p> </div>

    </div> 

</div>

这是我的应用程序 => 发布 views.py:

def post_detail(request, slug=None):
    instance = get_object_or_404(Post, slug=slug)
    if instance.publish > timezone.now().date() or instance.draft:
        if not request.user.is_staff or not request.user.is_superuser:
            raise Http404
    share_string = quote_plus(instance.content)

    initial_data = {
        "content_type": instance.get_content_type,
        "object_id": instance.id
    }
    form = CommentForm(request.POST or None, initial=initial_data)
    if form.is_valid() and request.user.is_authenticated():
        c_type = form.cleaned_data.get("content_type")
        content_type = ContentType.objects.get(model=c_type)
        obj_id = form.cleaned_data.get('object_id')
        content_data = form.cleaned_data.get("content")
        parent_obj = None
        try:
            parent_id = int(request.POST.get("parent_id"))
        except:
            parent_id = None

        if parent_id:
            parent_qs = Comment.objects.filter(id=parent_id)
            if parent_qs.exists() and parent_qs.count() == 1:
                parent_obj = parent_qs.first()


        new_comment, created = Comment.objects.get_or_create(
                            user = request.user,
                            content_type= content_type,
                            object_id = obj_id,
                            content = content_data,
                            parent = parent_obj,
                        )
        return HttpResponseRedirect(new_comment.content_object.get_absolute_url())


    comments = instance.comments
    context = {
        "title": instance.title,
        "instance": instance,
        "share_string": share_string,
        "comments": comments,
        "comment_form":form,
    }
    return render(request, "post_detail.html", context)

这是我的应用程序 => 发布 urls.py:

from django.contrib import admin
from django.urls import path, re_path
from .views import (post_list,
    post_create,
    post_detail,
    post_update,
    post_delete,
)   urlpatterns = [
path('', post_list, name='list'),
path('create/', post_create),
re_path('(?P<slug>[\w-]+)/edit/', post_update, name='update'),
re_path('(?P<slug>[\w-]+)/delete/', post_delete),
re_path('(?P<slug>[\w-]+)/', post_detail, name='detail'),  ]

这里是帖子 models.py 和 upload_location :

def upload_location(instance, filename):
    PostModel = instance.__class__
    new_id = PostModel.objects.order_by("id").last().id + 1
    return "%s/%s" %(new_id, filename)

class Post(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=1)
    title = models.CharField(max_length=40, null=False)
    slug = models.SlugField(unique=True)
    image = models.ImageField(upload_to=upload_location, null=True, blank=True, width_field="width_field", height_field="height_field")
    height_field = models.IntegerField(default=0)
    width_field = models.IntegerField(default=0)
    content = models.TextField()
    draft = models.BooleanField(default=False)
    publish = models.DateField(auto_now=False, auto_now_add=False)
    read_time =  models.IntegerField(default=0)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

这是我的 settings.py 和 main_app urls.py:

Settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn")
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media_cdn")

main_app urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('comments/', include(('comments.urls', 'comments'), namespace='comments')),
    path('register/', register_view, name='register'),
    path('login/', login_view, name='login'),
    path('logout/', logout_view, name='logout'),
    path('', include(('posts.urls', 'posts'), namespace='posts')),]  


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

【问题讨论】:

  • 由什么负责在 MEDIA_URL 上提供媒体文件?
  • MEDIA_ROOT 负责提供媒体文件,在我的 main_app urls.py 中我定义了 MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media_cdn")。当我在我的博客上上传图片时,它们会出现在 media_cdn 目录中,但它们无法显示在我的博客上。
  • 通过在

    标签中添加{{ instance.image.url }} 来检查路径是否正确。您可以从urlpatterns += 中删除这一行urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 它应该是if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

  • 我刚刚检查了路径,它是正确的“/media/4/Chercher-Dieu.jpg”,我还删除了您刚才提到的行,但我仍然遇到同样的错误。感谢您提供帮助。

标签: python html django markdown


【解决方案1】:

默认情况下,上传的文件不会在开发中提供。

将此添加到您的 URL 模式的末尾:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

文档:https://docs.djangoproject.com/en/2.1/howto/static-files/#serving-files-uploaded-by-a-user-during-development

但是,这不适合生产,所以当你到达那个阶段时,你将需要一些其他方法(从 nginx 或 CDN 或其他方式提供服务)。

【讨论】:

  • 我已经在我的 URL 模式的末尾添加了这个,但我仍然遇到同样的错误,我只是编辑了上面的代码。感谢您的回答。
  • 我看不出你的代码有什么问题。我假设您正在使用 runserver 并且自从您进行更改后您已经重新启动它?我会尝试在管理员中上传另一个文件并查看它是否显示,也许其中一个目录已更改,因为您一直在尝试修复它。
  • 我在进行更改后重新启动了它,但仍然出现相同的错误。如果其中一个目录发生了变化,我该如何解决这个问题?
  • 好吧,您必须将旧目录中的所有文件移动到新目录中 - 但我只是尝试上传一个新文件 - 如果仍然无法正常工作,这不是您的问题
猜你喜欢
  • 2012-09-10
  • 1970-01-01
  • 2021-09-30
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
相关资源
最近更新 更多