Я загружаю определенные носители в конкретный каталог, чтобы его защитить. Изображения загружаются с использованием объекта inlineformset_factory.Переопределение значения href img src в ImageField в Django admin
Проблема заключается в том, что при просмотре загруженной записи на админ-сайте она, как представляется, добавляет мои настройки.MEDIA_URL (/ media /) к пути загруженного изображения.
ie.
http://localhost:8000/media/<relative image path>
То, что я хотел бы, чтобы использовать вместо этого пользовательской настройки, settings.PROTECTED_MEDIA_URL («ЦСИ»), чтобы вернуть следующий путь вместо:
http://localhost:8000/scr/<relative image path>
Включен ниже, что я считаю, являются соответствующие части кода.
Любое понимание оценено!
settings.py
...
MEDIA_URL = '/media/'
PROTECTED_MEDIA_URL = '/scr/'
...
model.py
...
from django.core.files.storage import FileSystemStorage
fs = FileSystemStorage(location = '/home/user/nginx_restricted')
def orig_car_id_folder(instance, filename):
return 'uploads/images/orig/{0}/{1}'.format(instance.car_id, filename)
class OwnersCar(models.Model):
brand = models.CharField(max_length=64)
...
class OwnersCarImages(models.Model):
car = models.ForeignKey(OwnersCar)
orig_image = models.ImageField(
upload_to=orig_car_id_folder,
verbose_name='Upload Image',
storage=fs
)
...
...
admin.py
from django.contrib import admin
from vehicle_admin_ac.models import OwnersCar, OwnersCarImages
class CarImageInline(admin.TabularInline):
model = OwnersCarImages
exclude = ('thumbnail',)
class OwnersCarAdmin(admin.ModelAdmin):
list_display = ('owner','brand',)
ordering = ('owner',)
search_fields = ('owner',)
inlines = [
CarImageInline,
]
admin.site.register(OwnersCar, OwnersCarAdmin)
urls.py
...
urlpatterns = patterns('',
url(r'^scr/(?P<protected_image_path>/uploads/images/(thumb|orig)/.*)$',
'vehicle_admin_ac.views.protected_view',
name='protected_view'),
...
)
...
views.py
...
@login_required
def protected_view(request, protected_image_path):
response = HttpResponse()
url = protected_image_path
response['Content-Type']=""
response['X-Accel-Redirect'] = "/protected/{0}".format(url)
return response
@login_required
def add_vehicle(request):
ImageFormSet = inlineformset_factory(OwnersCar, OwnersCarImages, form=InitialCarImageForm, extra=3)
owners_car = OwnersCar()
if request.method == 'POST':
form = forms.OwnersCarForm(request.POST, instance=owners_car)
formset = ImageFormSet(request.POST, request.FILES, instance=owners_car)
if formset.is_valid() and form.is_valid():
new_car = form.save(commit=False)
new_car.owner = request.user
new_car.save()
formset.save() # save() method works fine with 'inlineformset_factory'
return HttpResponseRedirect(new_car.get_absolute_url())
else:
form = forms.OwnersCarForm()
formset = ImageFormSet()
return render_to_response('add_new.html',
{'form': form, 'formset': formset},
context_instance=RequestContext(request))
...
Gah, просто прочитайте о base_url как аргументе FileSystemStorage в [docs] (https://docs.djangoproject.com/en/dev/topics/files/#the-built-in-filesystem-storage-class). Я устанавливаю base_url = '/ src /', и изображение обрабатывается отлично. – jayuu
Пожалуйста, разместите свое решение в качестве ответа и примите его сами. –