【问题标题】:ListField not found error in django在 django 中未找到 ListField 错误
【发布时间】:2018-02-18 07:27:52
【问题描述】:

我正在尝试将 mongodb 与 django 一起使用。我的主要项目名称是“mysite”,其中有一个名为“blog”的应用程序,在 blog/models.py 中,我编写了以下部分。

from django.db import models
from djangotoolbox.fields import ListField

class Post(models.Model):
    title = models.CharField()
    text = models.TextField()
    tags = ListField()
    comments = ListField()

我已经安装了 djangotoolbox。当我在 python shell 上运行命令时

from blog.models import Post

它显示以下错误。

>>> from blog.models import Post
 Traceback (most recent call last):
File "<console>", line 1, in <module>
File "E:\Study\mysite\blog\models.py", line 2, in <module>
from djangotoolbox.fields import ListField
File "C:\Program Files (x86)\Python36-32\Lib\site-packages\djangotoolbox\fields.py", line 4, in <module>
from django.utils.importlib import import_module
ModuleNotFoundError: No module named 'django.utils.importlib'
>>>

为什么会出现这个错误?它的解决方案是什么?因为我在网上找遍了都找不到。

【问题讨论】:

    标签: python django mongodb python-3.x listfield


    【解决方案1】:

    ListField 覆盖 formfield 方法:

    models.py

    from djangotoolbox.fields import ListField
    from .forms import StringListField
    
    class TagField(ListField):
        def formfield(self, **kwargs):
            return models.Field.formfield(self, StringListField, **kwargs)
    
    class CommentField(ListField)
        def formfield(self, **kwargs):
            return models.Field.formfield(self, StringListField, **kwargs)
    
    class Post(models.Model):
        title = models.CharField()
        text = models.TextField()
        tags = TagField()
        comments = CommentField()
    

    然后,在forms.py中,我们定义StringListField:

    from django import forms
    
    class StringListField(forms.CharField):
        def prepare_value(self, value):
            return ', '.join(value)
    
        def to_python(self, value):
            if not value:
                return []
            return [item.strip() for item in value.split(',')]
    

    admin.py

    from django.contrib.admin import site, ModelAdmin
    from models import Post
    
    def tags(instance):
        return ', '.join(instance.tags)
    
    def comments(instance):
        return ', '.join(instance.comments)
    
    class PostAdmin(ModelAdmin):
        list_display = ['title', 'text', tags, comments]
    
    site.register(Post, PostAdmin)
    

    这会将逗号分隔的输入框内容转换为 Python 列表,并将从数据库中获取的列表值转换为逗号分隔的字符串,然后显示在输入框中。

    >>> Post.objects.get(title='foo').comments
    [u'foo', u'bar']
    

    【讨论】:

    • 这不起作用。实际上 ListField 丢失了,但它不应该丢失。我想我错过了一些其他的包/文件,但无法弄清楚是哪个文件。
    【解决方案2】:

    你可以写

    from .models import Post 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 2018-08-04
      • 1970-01-01
      • 2017-07-17
      • 2016-09-12
      • 2013-07-30
      • 1970-01-01
      • 2020-03-28
      相关资源
      最近更新 更多