django Поле изображения панели администратора создает неправильный путь к изображению - PullRequest
0 голосов
/ 26 марта 2020

У меня есть поле изображения, которое загружается в каталог media /. В админ-панели django она ссылается на admin / api / character / 2 / change / media / image.jpg, а не на media / image.jpg. Как мне исправить это?

edit: html - все стандартные шаблоны django admin. на самом деле, ничего особенного в этом нет. поле изображения прямое django. административный шаблон прямой django. реализация все прямо django. settings.py выглядит следующим образом

 13 import os
 14 
 16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 17 
 23 from loot_tracker.secrets import secrets
 24 SECRET_KEY = secrets['secret_key']
 25 
 27 DEBUG = True
 28 
 29 ALLOWED_HOSTS = ['*',]
 33 
 34 INSTALLED_APPS = [
 35     'jet.dashboard',
 36     'jet',
 37     'django.contrib.admin',
 38     'django.contrib.auth',
 39     'django.contrib.contenttypes',
 40     'django.contrib.sessions',
 41     'django.contrib.messages',
 42     'django.contrib.staticfiles',
 43 
 44     'django_extensions',
 45     'django_filters',
 46     'django_user_agents',
 47     'rest_framework',
 48     'tracking_analyzer',
 49 
 50     'api',
 51 ]
 52 
 53 MIDDLEWARE = [
 54     'django.middleware.security.SecurityMiddleware',
 55     'django.contrib.sessions.middleware.SessionMiddleware',
 56     'django.middleware.common.CommonMiddleware',
 57     'django.middleware.csrf.CsrfViewMiddleware',
 58     'django.contrib.auth.middleware.AuthenticationMiddleware',
 59     'django.contrib.messages.middleware.MessageMiddleware',
 60     'django.middleware.clickjacking.XFrameOptionsMiddleware',
 61 ]
 62 
 63 ROOT_URLCONF = 'loot_tracker.urls'
 64 
 65 TEMPLATES = [
 66     {
 67         'BACKEND': 'django.template.backends.django.DjangoTemplates',
 68         'DIRS': [],
 69         'APP_DIRS': True,
 70         'OPTIONS': {
 71             'context_processors': [
 72                 'django.template.context_processors.debug',
 73                 'django.template.context_processors.request',
 74                 'django.contrib.auth.context_processors.auth',
 75                 'django.contrib.messages.context_processors.messages',
 76             ],
 77         },
 78     },
 79 ]
 80 
 81 WSGI_APPLICATION = 'loot_tracker.wsgi.application'
 82 
 87 DATABASES = {
 88         'default': {
 89         'ENGINE': 'django.db.backends.postgresql_psycopg2',
 90         'NAME': 'postgres',
 91         'USER': 'postgres',
 92         'PASSWORD': secrets['db_pass'],
 93         'HOST': 'db',
 94         'PORT': '',
 95     }
 96 }
 97 
102 AUTH_PASSWORD_VALIDATORS = [
103     {
104         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
105     },
106     {
107         'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
108     },
109     {
110         'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
111     },
112     {
113         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
114     },
115 ]
120 
121 LANGUAGE_CODE = 'en-us'
122 
123 TIME_ZONE = 'UTC'
124 
125 USE_I18N = True
126 
127 USE_L10N = True
128 
129 USE_TZ = True
134 
135 STATIC_URL = '/static/'
136 STATIC_ROOT = os.path.join(BASE_DIR, 'public')
137 
138 REST_FRAMEWORK = {
139     'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
140     'PAGE_SIZE': 50
141 }
142 
143 CORS_ORIGIN_ALLOW_ALL = True
145 
146 GEOIP_PATH = os.path.join(BASE_DIR, 'geoip/')
147 
148 CLIENT_ID = secrets['client_id']
149 CLIENT_SECRET = secrets['client_secret']
~                                                   

models.py, обратите внимание на поле аватара.

  8 class Character(models.Model):
  9     name = models.CharField(max_length=20, unique=True)
 10     level = models.IntegerField(default=2)
 11     game_class = models.CharField(max_length=20)
 12     guild = models.ForeignKey('Guild', blank=True, null=True, on_delete=models.PROTECT)
 13     avatar = models.ImageField(upload_to='media/', default='media/tyrone.jpg')

admin.py для краткости

  9 class CharacterAdmin(admin.ModelAdmin):
 10     search_fields = ('name', 'game_class', 'level')
 11 admin.site.register(Character, CharacterAdmin)


1 Ответ

1 голос
/ 26 марта 2020

Допущения:

  • Вы обслуживаете администратора django через mysite.com/admin/
  • На вашем сервере есть каталог с именем .../media/, куда файлы загружаются правильно
  • Эти файлы в .../media/ правильно обслуживаются через URL mysite.com/media/ (например, если вы вручную наберете mysite.com/media/myfile.jpg в браузере, вы получите файл .../media/myfile.jpg на своем сервере)
  • Вы находитесь в mysite.com/admin/api/character/2/change/ и у вас есть поле для файла, куда вы можете загружать файлы (и вы видите их на своем сервере при загрузке)

Проблема:

  • URL / ссылка файла, представляемого администратором Django ПОСЛЕ загрузки mysite.com/admin/api/character/2/change/media/image.jpg вместо mysite.com/media/image.jpg

Решение:

  • В настройках вашего Django app, определите настройку MEDIA_URL, чтобы Django знал, откуда следует отправлять медиафайлы. Поскольку вы не определили параметр, по умолчанию он равен MEDIA_URL='', поэтому фактически он только добавляет путь к файлу к текущему URL.

Side Примечание:

  • Параметр upload_to в FileField относится к каталогу ВНУТРИ хранилища, которое вы используете. В этом случае, если вы загружаете файлы в папку на вашем сервере с именем /home/mysite/media/ и устанавливаете upload_to='media/', все файлы, загруженные в это поле, будут загружены в /home/mysite/media/media/.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...