Django - 如何使ImageField / FileField可选?

时间:2010-04-20 18:30:44

标签: django django-models

class Product(models.Model):
    ...    
    image = models.ImageField(upload_to = generate_filename, blank = True)  

当我使用ImageField(空白= True)并且不选择图像到管理表单时,会发生异常。

在django代码中你可以看到:

class FieldFile(File):
   ....

    def _require_file(self):
        if not self:
            raise ValueError("The '%s' attribute has no file associated with it." % self.field.name)

    def _get_file(self):
        self._require_file()
        ...

Django trac有关于这个问题的票#13327,但似乎无法很快修复。如何使这些字段可选?

3 个答案:

答案 0 :(得分:23)

设置null=True(请参阅documentation

class Product(models.Model):
    ...    
    image = models.ImageField(upload_to=generate_filename, blank=True, null=True)

答案 1 :(得分:18)

blank=True应该有效。如果此属性(默认情况下为False)设置为True,那么它将允许输入空值。

我在文章应用中有以下课程:

class Photo(models.Model):
        imagename = models.TextField()
        articleimage = models.ImageField(upload_to='photos/%Y/%m/%d', blank=True)

我使用ManyToManyField关系在另一个类中使用上面的类:

class Article(models.Model):
        pub_date = models.DateTimeField(default=timezone.now)
        slug = models.SlugField(max_length=130)
        title = models.TextField()
        photo = models.ManyToManyField(
            Photo, related_name='photos', blank=True)
        author = models.ForeignKey(User)
        body = models.TextField()
        categories = models.ManyToManyField(
            Category, related_name='articles', null=True)

我想让文章中的图片可选,因此{/ 1}}

blank=True

是必要的。如果我愿意,这允许我创建一个没有任何图像的文章。

您是否在任何关系中使用班级photo = models.ManyToManyField(Photo, related_name='photos', blank=True) ?如果是这样,请务必在您正在使用的关系中设置Product

答案 2 :(得分:0)

如果 'optional' 意味着您希望能够完全忽略图像字段。然后blank=True,所以做的伎俩。但是,如果您仍然遇到相同的错误,那么这意味着您在模板中的某处使用它是 url,或者您正在尝试在 models.py 或 {{1} 中打开图像的路径}}(可能是调整图像大小或其他一些后端预处理)。 这就是为什么在处理文件时总是建议使用 views.py - try 块的原因。