模块'models'没有属性'ImageField'

时间:2018-01-04 16:50:28

标签: python django model

我正在尝试将一个ImageField添加到django模型中,但是我收到一个错误,告诉ImageField不存在:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/trie/Desktop/django/venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/home/trie/Desktop/django/venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/trie/Desktop/django/venv/lib/python3.5/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/trie/Desktop/django/venv/lib/python3.5/site-packages/django/core/management/base.py", line 335, in execute
    output = self.handle(*args, **options)
  File "/home/trie/Desktop/django/venv/lib/python3.5/site-packages/django/core/management/commands/makemigrations.py", line 78, in handle
    loader = MigrationLoader(None, ignore_no_migrations=True)
  File "/home/trie/Desktop/django/venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 49, in __init__
    self.build_graph()
  File "/home/trie/Desktop/django/venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 200, in build_graph
    self.load_disk()
  File "/home/trie/Desktop/django/venv/lib/python3.5/site-packages/django/db/migrations/loader.py", line 109, in load_disk
    migration_module = import_module("%s.%s" % (module_name, migration_name))
  File "/home/trie/Desktop/django/venv/lib/python3.5/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 673, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "/home/trie/Desktop/django/vidmiotest/models/migrations/0013_video_thumbnail.py", line 7, in <module>
    class Migration(migrations.Migration):
  File "/home/trie/Desktop/django/vidmiotest/models/migrations/0013_video_thumbnail.py", line 17, in Migration
    field=models.ImageField(blank=True, null=True, upload_to=models.models.Video.user_directory_path),
AttributeError: module 'models' has no attribute 'ImageField'

这是我添加ImageField的代码:

thumbnail = models.ImageField(upload_to=user_directory_path, default='admin/test.png', max_length=256)

我正在使用django版本:Django-2.0.1

models.py:

from django.db import models
from django.conf import settings
from django.db.models.signals import pre_save, post_save

from .IdentifierGenerator import unique_slug_generator

# All models are declared here

User = settings.AUTH_USER_MODEL

class Category(models.Model):
    description = models.CharField(max_length=120)

    def __str__(self):
        return self.description


class Video(models.Model):
    def user_directory_path(instance, filename):
        # file will be uploaded to MEDIA_ROOT/user_<id>/<identifier>
        return 'user_{0}/{1}.png'.format(instance.user.id, instance.identifier)

    uploader    = models.ForeignKey(User, on_delete=models.CASCADE)
    title       = models.CharField(max_length=120)
    identifier  = models.SlugField(blank=True, null=True)
    category    = models.CharField(max_length=120, default="uncategorized")
    description_short = models.CharField(max_length=300, default="none")
    description = models.TextField(default="none")
    uploaded    = models.DateTimeField(auto_now_add=True)
    updated     = models.DateTimeField(auto_now=True)
    time        = models.IntegerField()
    thumbnail   = models.ImageField(upload_to=user_directory_path, default='admin/test.png', max_length=256)


    # Used to show video title in django admin page instead of 'video object(n)'
    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return "/view/" + self.identifier


# generate short description and identifier if none are present
def pre_save_reciver(sender, instance, *args, **kwargs):
    if instance.description_short == 'none':
        if len(instance.description) > 297:
            instance.description_short = instance.description[:297]
            instance.description_short += '...'
        else:
            instance.description_short = instance.description
    if not instance.identifier:
        instance.identifier = unique_slug_generator(instance)


pre_save.connect(pre_save_reciver, sender=Video)

3 个答案:

答案 0 :(得分:0)

好吧问题在于我的一个应用程序实际上被称为模型(显然django不喜欢它)......

更改最新的迁移文件
from django.db import migrations, models
import models.models


class Migration(migrations.Migration):

    dependencies = [
        ('models', '0013_video_thumbnail'),
    ]

    operations = [
        migrations.AlterField(
            model_name='video',
            name='thumbnail',
            field=models.ImageField(default='admin/test.png', max_length=256, upload_to=models.models.Video.user_directory_path),
        ),
    ]

为:

from django.db import migrations, models
import models.models
from django import db


class Migration(migrations.Migration):

    dependencies = [
        ('models', '0013_video_thumbnail'),
    ]

    operations = [
        migrations.AlterField(
            model_name='video',
            name='thumbnail',
            field=db.models.ImageField(default='admin/test.png', max_length=256, upload_to=models.models.Video.user_directory_path),
        ),
    ]

解决了问题并允许我进行迁移......

答案 1 :(得分:0)

您是否已安装“枕头”软件包? 如果不是这样的原因是因为您没有在系统中添加“枕头”软件包,则可以通过在cmd中编写此命令来轻松添加它

boundariesRectangle.frame = CGRect(x: imageXposition, y: imageYposition, width: imageWidth, height: imageHeight)

如果使用

  

Anaconda软件包管理器

搜索枕头并安装它 可以解决

答案 2 :(得分:0)

枕头是处理ImageField错误的最简单的库。

“ https://pypi.org/project/Pillow/”-用于更多说明

pip安装枕头

如果使用env,则使用 pipenv安装枕头