使用自定义媒体链接(不是MEDIA_ROOT)形成ImageField

问题描述:

用户应将其护照数据上传到网站。这些数据是私人的,所以它会更好,如果它将被放置在服务器的目录之外。使用自定义媒体链接(不是MEDIA_ROOT)形成ImageField

这里是一个模式:

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 perfect :)你可以检查'is_superuser',也许? – ilvar 2012-04-19 05:15:07

+0

哦,谢谢,我总是忘记所有这些东西已经在django中提供:) – 2012-04-19 06:56:40

我会覆盖管理窗体的小部件,使用普通的上传小部件,而不是更复杂的管理上传小部件与链接和删除复选框。如果不可接受,您可以基于管理文件小部件编写自己的小部件,并在其中提供必要的URL。