Django admin实现图片文件上传

2010-04-24 22:52:18 by sand, 1636 visits, Tags: admin, Python, Django,

一般大家都知道django有个很好用的管理后台admin,普通应用这里就不说了,介绍一下他里面的内置实现的文件上传功能

  1. 首先在model里定义属性:
    pic = models.ImageField('图片',upload_to='uploadImages')
     
  2. 修改setting.py
    MEDIA_ROOT = 'media1001/'
    MEDIA_URL = '/webhost_media/'
     
  3. 数据库对应实体的表中添加pic字段,属性为文本,这个只是用来保存文件路径的
     
  4. 上面配置代表的意思大概是:
    上传图片到:web程序目录/media1001/uploadInages/
    访问路径为:http://hostname/webhost_media/uploadImages/filename.jpg
     
  5. 基本就是这样,大家可以试一下,很方便,页面调用为modelobjname.pic.url

     

错误及解决:
 

  1. framework.product: "pic": To use ImageFields, you need to install the Python Imaging Library. Get it at http://www.pythonware.com/products/pil/ .

    解决:安装Python Imaging Library (PIL)
    1)下载:
    官方:http://www.pythonware.com/products/pil/
    直接下载:http://effbot.org/downloads/Imaging-1.1.7.tar.gz
    2)运行命令安装:
    sudo python setup.py install
     
  2. ImageField causing error when rendering with "The Image" attribute has no file associated with it.

    解决:调用pic.url时要先判断pic不为空

有问题请留言或联系我,一定尽力解答,Good Luck!

评论 (2)        

Django admin一对多及多对多内容过滤

2010-04-17 23:11:24 by sand, 954 visits, Tags: admin, Python, Django,

Django中admin是内置集成的管理后台,其中多对多及多对一关联有一个参数 limit_choices_to用来限制表单中的对应选项

目前可用的值只能是静态的例如:

limit_choices_to={'type':0}

代表限制只显示type=0的内容

假如碰到高级的过滤,例如我想只显示type和本对象type相等的,就没办法实现了,例如:

limit_choices_to={'type':self.type}是不可行的,因为这个代码是在类定义里,是没有self定义的
报错为:NameError: name 'self' is not defined

也许有人会想到用'self'.type,就类似自关联那种models.ForeignKey('self'),实际上这也是不行的
报错为:AttributeError: 'str' object has no attribute 'type',python把'self'当成普通字符串对象处理了

下面介绍一种可以达到你想要效果的办法,自定义表单:

代码大概的意思就是定义了Menu对象,并和自己关联,代表菜单可以有自己的上级菜单,但是在form里做了限制,在admin管理编辑页面中选择上级时将看不到自己,因为自己不能作为自己的上级
过滤目标对象id不等于当前对象id

class Menu(models.Model): title = models.CharField('title', max_length=50, unique=True)
    parentMenu = models.ForeignKey('self', verbose_name='parent menu',blank=True, null=True)

class MenuForm(forms.ModelForm): def __init__(self, *args, **kwargs):
        super(MenuForm, self).__init__(*args, **kwargs) if'instance'in kwargs:
            self.fields['parentMenu'].queryset = Menu.objects.exclude(id=kwargs['instance'].id)
class MenuAdmin(admin.ModelAdmin):
    model = Menu
     form=MenuForm
 

基本就是这样,描述的有点乱,不过真正碰到类似问题的人,应该可以看明白。

有问题请留言一定尽力解答。

 

评论 (2)