Django - как сделать ImageField / FileField необязательным?

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

Когда я использую ImageField (blank = 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 об этой проблеме, но, похоже, ее не удастся исправить в ближайшее время. Как сделать это поле необязательным?


person ilya    schedule 20.04.2010    source источник
comment
Вы нашли решение, похоже, у меня такая же проблема сейчас   -  person niklas    schedule 29.05.2014


Ответы (3)


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)

Я хочу, чтобы изображения в моих статьях были необязательными, поэтому blank=True в

photo = models.ManyToManyField(Photo, related_name='photos', blank=True)

это необходимо. Это позволяет мне создавать статью без изображений, если я хочу.

Используете ли вы класс Product в каких-либо отношениях? Если это так, не забудьте установить blank=True в используемом вами отношении.

person orthodoxpirate    schedule 15.10.2014
comment
почему вы не используете null для изображения? - person youHaveAlsoBeenABeginner; 17.07.2020
comment
Пытаясь сделать это, я получаю django.db.utils.IntegrityError: NOT NULL constraint failed: new__app_idea.image - person CGFoX; 21.07.2020

Установите null=True (см. документацию)

class Product(models.Model):
    ...    
    image = models.ImageField(upload_to=generate_filename, blank=True, null=True)
person Nathan    schedule 20.04.2010
comment
null = True - это страшно, blank = True достаточно, потому что ImageField / FileField на самом деле являются CharFields внизу ... - person dlamotte; 28.08.2010
comment
null = True ничего не делает для FileField или ImageField code.djangoproject.com/ticket/10244 - person nont; 12.05.2012

Если 'необязательный' означает, что вы хотите полностью игнорировать поле изображения. Тогда blank=True, так что сделай трюк. Однако, если вы все еще получаете ту же ошибку, это означает, что вы используете ее url либо в шаблоне, либо пытаетесь открыть путь к изображению в models.py или views.py (может быть, чтобы изменить размер изображения или какой-либо другой внутренняя предварительная обработка). Поэтому всегда рекомендуется использовать блок try - catch при работе с файлами.

person Amiay Narayan    schedule 28.02.2021