2013-05-24 2 views
0

Я загружаю определенные носители в конкретный каталог, чтобы его защитить. Изображения загружаются с использованием объекта 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)) 
... 
+0

Gah, просто прочитайте о base_url как аргументе FileSystemStorage в [docs] (https://docs.djangoproject.com/en/dev/topics/files/#the-built-in-filesystem-storage-class). Я устанавливаю base_url = '/ src /', и изображение обрабатывается отлично. – jayuu

+0

Пожалуйста, разместите свое решение в качестве ответа и примите его сами. –

ответ

0

Вот link соответствующая часть документации, что я пропустил, объясняя base_url аргумент.

Смежные вопросы