【问题标题】:Django static url auto prefixesDjango 静态 url 自动前缀
【发布时间】:2016-02-25 17:05:05
【问题描述】:

我已经看到了很多关于这个主题的问题和答案,但没有一个对我有帮助。 所以,问题是:直到我在 html 中的地址中的任何地址之前手动添加“/”之前,都没有提供静态文件。 而且我总是在地址上获得双静态文件文件夹前缀,如下所示:'content/static/content/static/js/my.js'

我无法克服的最后一个问题是这个图像裁剪字段不起作用,我假设因为它无法获得正确的图像 url,因为上面写了双前缀。我无法修复它,因为机制写在https://github.com/jonasundderwolf/django-image-cropping 中。有没有办法改变这种 django 行为?在编辑器字段中,我遇到了同样的问题,但我通过手动覆盖 save() 方法修复了它,更改了上传图像的 url 以便它们开始显示,但它不能自动工作,我不明白为什么。 请帮忙。

我试过 {% static 'some_file' %},有时它可以工作,有时不能,所以它不是一个解决方案。

所以,我的 django 项目结构是这样的:

  1. 项目
    • 内容
      • 模板
      • 静态
    • 项目

项目/urls.py:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include ('content.urls')),
    url(r'^redactor/', include('redactor.urls')),
]

from django.conf.urls import patterns
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

urlpatterns += staticfiles_urlpatterns()

settings.py:

INSTALLED_APPS = (
    'content',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'redactor',
    'pure_pagination',
    'django_cleanup',
    'image_cropping',
    'easy_thumbnails',
)

from easy_thumbnails.conf import Settings as thumbnail_settings
THUMBNAIL_PROCESSORS = (
    'image_cropping.thumbnail_processors.crop_corners',
) + thumbnail_settings.THUMBNAIL_PROCESSORS

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

STATIC_URL = '/content/static/'

STATICFILES_FINDERS = ( 
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(
        os.path.dirname(__file__),
    ),
    "C:/Work/Snejana/magazine31.01.2016/content/static/upload_images",
    "C:/Work/Snejana/magazine31.01.2016/content/static",
    "C:/Work/Snejana/magazine31.01.2016",
)

来自 content/models.py 的一个模型:

class Author(models.Model):

    class Meta:
        verbose_name = 'Автора'
        verbose_name_plural = 'Авторы'

    author_name              = models.CharField(max_length=200, verbose_name=u'Имя автора')
    regalias                 = models.CharField(max_length=200, blank=True, verbose_name=u'Регалии')
    description              = RedactorField(blank=True,
                                             verbose_name=u'Описание автора',
                                             redactor_options={'lang': 'en', 'focus': 'true'},
                                             upload_to='content/static/upload_images/',
                                             allow_file_upload=True,
                                             allow_image_upload=True)
    photo_full               = models.ImageField(upload_to="content/static/upload_images/",
                                                 verbose_name=u'Фото',
                                                 default=None,
                                                 blank=True,
                                                 null=True)
    photo_thumbnail          = models.ImageField(upload_to="content/static/upload_images/",
                                                 verbose_name=u'Фото маленькое',
                                                 default=None,
                                                 blank=True,
                                                 null=True)
    publications_of_author   = models.ForeignKey('Publication', blank=True, null=True, verbose_name=u'Публикации автора')
    cropping1 = ImageRatioField('photo_full', '600x400')
    cropping2 = ImageRatioField('photo_thumbnail', '100x80')

最后一个,admin.py:

class AuthorAdmin(ImageCroppingMixin, admin.ModelAdmin):
    fieldsets = [
        ('Информация об авторе', {'fields': ['author_name', 'description', 'photo_full', 'photo_thumbnail','cropping1', 'regalias'], 'classes': ['collapse']}),
    ]
    readonly_fields = ('photo_thumbnail',)
    inlines = [AuthorsPublicationsInline]

    class Media:
        js = ['http://code.jquery.com/jquery-latest.min.js', 'js/collapsed_stacked_inlines.js',]

【问题讨论】:

  • 您使用的是哪个版本的 Django?您在使用collectstatic 管理实用程序吗?另外,我认为STATICFILES_DIRS是递归遍历的,所以你只需要定义C:/Work/Snejana/magazine31.01.2016而不是其他两个。
  • 另外两个是绝望的,没必要的。我在这个项目中没有使用 collectstatic,但我之前尝试过它并没有帮助。与将 {% load staticfiles %} 放置在自定义管理模板以及所有站点模板中相同。直到我手动将“/”添加到硬编码网址的开头,它才能解决问题。

标签: python django static redactor.js


【解决方案1】:

您的upload_to 属性不应包含前缀;它们是相对于 MEDIA_ROOT 的。

photo_full = models.ImageField(upload_to="upload_images/", ...)

【讨论】:

  • 但是如果我没有定义MEDIA_ROOT 呢?或者我没有一个静态文件夹,但每个应用程序都有一个?
  • 您必须定义一个。并且您可以拥有特定于应用程序的文件夹,但它们必须位于 MEDIA_ROOT 下。
  • 现在试过了。它以与以前相同的方式创建图像,在相同的位置,但它仍然不起作用,图像不会显示在管理员中。不起作用,因为计算的地址是相对于用户的当前地址的,它试图改变某些模型中的某些东西。所以它就像 site/admin/change/model/1/upload_images/image 并且这个应用程序不会在相对路径之前添加“/”,以便从根域计算路径,而不是从 /admin/change/model/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2013-04-21
  • 2012-07-15
  • 1970-01-01
  • 2016-06-25
  • 2017-10-31
  • 1970-01-01
相关资源
最近更新 更多