【问题标题】:How to change upload_to parameter of ImageField based on field name in Django?如何根据Django中的字段名称更改ImageField的upload_to参数?
【发布时间】:2015-05-20 12:23:03
【问题描述】:

我想根据 Django 管理员用户提供的字段值将图像上传到媒体根目录。这是我编写的代码,我知道 upload_to 参数导致了问题。但我不知道如何让它工作。

models.py

class Info(models.Model):
    file_no = models.CharField(max_length=100)
    date = models.DateField()
    area = models.IntegerField(default=0.00)
    mouja = models.CharField(max_length=100)
    doc_type_choices = (
            ('deed', 'Deed'),
            ('khotian', 'Khotian'),
        )
    doc_type = models.CharField(max_length=50,
                                choices=doc_type_choices,
                                default='deed')
    doc_no = models.CharField(max_length=50)

    def __unicode__(self):
        return self.file_no

class Image(models.Model):
    info = models.ForeignKey('Info')
    content = models.ImageField(upload_to=self.info.mouja/self.info.doc_type)

    def __unicode__(self):
        return self.info.file_no

每当我运行 python manage.py makemigrations 时,它都会显示 NameError: name 'self' is not defined 提前感谢您的帮助!

【问题讨论】:

    标签: django models filefield imagefield


    【解决方案1】:

    upload_to 关键字中,您需要提供一个您将定义的函数,例如:

    def path_file_name(instance, filename):
        return '/'.join(filter(None, (instance.info.mouja, instance.info.doc_type, filename)))
    
    class Image(models.Model):
        content = models.ImageField(upload_to=path_file_name)
    

    来自Django documentation: Model field reference

    这也可能是一个callable,比如一个函数,会被调用来获取上传路径,包括文件名。这个可调用对象必须能够接受两个参数,并返回一个 Unix 风格的路径(带有正斜杠)以传递给存储系统。

    在这个可调用对象中,在特定情况下是path_file_name 函数,我们从instance 字段构建一个路径,该字段是Image 模型的特定记录。

    filter 函数从列表中删除任何 None 项,join 函数通过将所有列表项与 / 连接来构造路径。

    【讨论】:

    • os.path.join 在这里会好很多。
    • 实际上第一个代码有效,但这个新代码无效。给出这个错误 --> AttributeError at /admin/index/info/add/ 'tuple' object has no attribute 'rfind'
    • 我在提供的代码中看不到任何rfind,这是否相关?确切的错误是什么?在哪里?
    • 输入所有数据后,在 Django Admin 中按“保存”时出现错误。这是错误的更大版本-> /admin/index/info/add/ 'tuple' 对象的 AttributeError 没有属性 'rfind' 请求方法:POST 请求 URL:localhost:8000/admin/index/info/add Django 版本:1.8.1 异常类型: AttributeError 异常值: 'tuple' 对象没有属性 'rfind' 异常位置: /usr/lib/python2.7/posixpath.py in split, line 92 Python 可执行文件: /usr/bin/python Python 版本: 2.7.6
    • 我回滚到最初的答案。也许os.path.join在这里更好,但我似乎也测试过这个。
    【解决方案2】:

    这是有效的原始代码。以防万一有人需要。

    def path_file_name(instance, filename):
        return '/'.join(filter(None, (instance.info.mouja, instance.info.doc_type, filename)))
    

    【讨论】:

      猜你喜欢
      • 2012-01-22
      • 1970-01-01
      • 2011-02-08
      • 2019-01-05
      • 2011-06-27
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      相关资源
      最近更新 更多