首页 > 解决方案 > 使用 markdown 和 cloudinary 的 django 应用程序

问题描述

我正在尝试使用django-markdownxanddj3-cloudinary-storage一起制作一个 django 应用程序。

所以其中一个功能django-markdownx是您可以将图像拖放到降价字段中,它会保存该图像并返回图像的路径。在本地,这工作得很好。将图像拖放到 makrdown 字段并按/media/markdownx/预期将其保存到路径,并且 markdown 字段中的图像路径是正确的。但是,在与 Cloudinary 连接后,这无法正常工作。拖放图像后,它将图像保存到 Cloudinary。但是markdown字段中的图片路径不正确。

这是我在模板中拖放时图像的路径![](https://<domain>/<username>/image/upload/v1/media/markdownx/f44db8f1-f5b3-488b-b4f8-e8c730156746.jpg)

这是我在管理员中拖放时图像的路径![](https://<domain>/<username>/image/upload/v1/media/markdownx/b41a8009-399d-4cc3-950a-7394536eece9.jpg)

然而,这是 Cloudinary 中的实际路径。

从模板保存的图像 https://<domain>/<username>/image/upload/v1595344310/media/markdownx/f44db8f1-f5b3-488b-b4f8-e8c730156746_nlek8c.jpg

从管理员保存的图像 https://<domain>/<username>/image/upload/v1595344381/media/markdownx/b41a8009-399d-4cc3-950a-7394536eece9_fgpoob.jpg

现在从路径中我可以看到版本(我假设)部分不同,最后一部分在_.

但是我该如何解决这个问题?或者这根本不可能实现?
在两者的文档中都找不到解决方案,django-markdownx因此dj3-cloudinary-storage任何建议/建议也非常有帮助。基本上,如果我可以将 Markdown 中的图像保存到云端,那将是一场胜利。

这是必要的代码。

点文件

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
django = "*"
pillow = "*"
autopep8 = "*"
dj3-cloudinary-storage = "*"
django-markdownx = "*"

[requires]
python_version = "3.8"

settings.py(必要部分)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.forms',  # for django-markdownx
    # third party
    'cloudinary_storage',
    'cloudinary',
    'markdownx',
    # local
    'pages.apps.PagesConfig',
]

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

# cloudinary configs
CLOUDINARY_STORAGE = {
    'CLOUD_NAME': <user_name>,
    'API_KEY': <public_key>,
    'API_SECRET': <secret_key>,
}
DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'

网址.py

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('markdownx/', include('markdownx.urls')),
    path('', include('pages.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

在我的pages应用程序中,这些是代码。

模型.py

from django.db import models
from django.urls import reverse
from markdownx.models import MarkdownxField


class Page(models.Model):
    title = models.CharField(max_length=255)
    description = MarkdownxField()
    cover = models.ImageField(upload_to='covers/', blank=True)

    def __str__(self):
        return self.title

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

视图.py

from django.views.generic import CreateView, DetailView

from .models import Page


class PageDetailView(DetailView):
    model = Page
    template_name = 'detail.html'


class PageCreateView(CreateView):
    model = Page
    template_name = 'new.html'
    fields = ('title', 'description', 'cover',)

网址.py

from django.urls import path

from .views import PageCreateView, PageDetailView

app_name = 'pages'

urlpatterns = [
    path('new/', PageCreateView.as_view(), name='new'),
    path('<int:pk>/', PageDetailView.as_view(), name='detail')
]

先感谢您 :)

标签: pythondjangocloudinarydjango-packagesdjango-markdownx

解决方案


使用 cloudinary 时,您可以按原样或随机后缀上传带有随机字符的资产。

由于dj3-cloudinary-storagecloudinary 没有正式支持,我不确定如何使用它。但如果您使用的是 cloudinary SDK,您可以执行以下操作:

cloudinary.uploader.upload("https://res.cloudinary.com/demo/image/upload/v1561532539/sample.jpg", use_filename = True,unique_filename = False)

推荐阅读