2012-04-18 1 views
0

Пользователь должен загрузить свои паспортные данные на сайт. Эти данные являются частными, поэтому будет лучше, если они будут размещены за пределами каталогов сервера.Форма ImageField с пользовательской медиа-ссылкой (не MEDIA_ROOT)

Вот модель:

passport_storage = FileSystemStorage(setting('ROOT_PATH')) 

class Passport(models.Model): 
    user    = models.OneToOneField(User) 

    scan    = models.ImageField(verbose_name=u'Scan or photo', storage=passport_storage, upload_to='passport', blank=True) 

    def preview_scan(self): 
     return '<a href="%s"> <img src="%s%s/?thumb=1"></img> </a>' % (self.id, PASSPORT_URL, self.id) 
    preview_scan.allow_tags = True 

Я написал метод просмотра для получения паспорта, или это большой палец:

@login_required 
def get_passport(request, **kwargs): 
    id = kwargs.pop('id', None) 
    user = request.user 

    passport = Passport.objects.filter(pk=id) 
    if user.username != 'admin': # говнокод 
     passport = passport.filter(user=user) 
    passport = passport[0] 
    scan = passport.scan 
    path = scan.path 
    sz = scan.size 

    if request.GET.get('thumb', None): 
     path = get_thumb(path) 
     sz = os.path.getsize(path) 

    filename = os.path.basename(path) 
    mt = mimetypes.guess_type(filename)[0] 

    wrapper = FileWrapper(file(path)) 
    response = HttpResponse(wrapper, mimetype=mt) 
    response['Content-Disposition'] = 'attachment; filename=%s' % filename 
    response['Content-Length'] = sz 

    return response 

Но ModelForm из паспорта модели отображает старый путь от /media/. Где я могу изменить ссылку ImageField в форме?

+0

'# говнокод' идеально :) Вы можете проверить вместо' is_superuser', может быть? – ilvar

+0

О, спасибо, я всегда забываю, что все это уже предусмотрено в django :) –

ответ

0

Я бы перезаписал виджеты формы администратора, чтобы использовать простой загрузочный виджет вместо более сложного виджета загрузки admin с ссылкой и удалить флажок. Если это неприемлемо, вы можете написать свой собственный виджет на основе виджета администратора и указать там необходимый URL.