1

我正在尝试使用 django-nonrel 在 Google App Engine 中构建示例应用程序。并且在将 ListField 属性实现到模型中时遇到问题。

我创建了一个应用程序test_model并将其作为已安装的应用程序包含在我的设置中。model.py 是:

从 django.db 导入模型
从 djangotoolbox 导入 *
从 dbindexer 导入 *

# 在这里创建你的模型。
类示例(模型。模型):
    some_choices = models.ListField('Choice_examples')
    注释 = models.CharField(max_length='20')
    updated_at = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        返回 u'%s' % (self.notes)


类 Choice_examples(models.Model):
    名称 = models.CharField(max_length='30')

    def __unicode__(self):
        返回 u'%s' % (self.name)

上面的例子给了我:
AttributeError:'module' object has no attribute 'Model'

如果我注释掉 djangotoolbox 导入,我会得到以下信息:
AttributeError: 'module' object has no attribute 'ListField'

我在这里做错了什么?我似乎找不到任何关于如何在 django-nonrel 中使用 ListField 的文档。那是因为它应该很明显吗?

4

4 回答 4

4

您的进口商品正在相互粉碎:

from django.db import models
from djangotoolbox import *

第二次导入将用 djangotoolbox 的空模型模块替换 django.db 模型。使用from X import *在 Python 中通常是一个糟糕的想法,并且会产生类似这样的令人困惑的结果。

如果您想使用 djangotoolbox 中的 ListField,请使用:

from djangotoolbox import fields

并将 ListField 类称为fields.ListField.

于 2010-10-08T20:42:05.110 回答
3

好的,这是我为能够使用 ListFields 所做的。MyClass等同于您的Example班级,并且AnotherClass与您的Choice_examples. 我所描述的将允许您ListField在管理界面和您自己实现的视图中使用 s。

我会从头开始

这就是我的模型的样子

class MyClass(models.Model):
    field = ListField(models.ForeignKey(AnotherClass))

我希望能够使用管理界面创建/编辑此模型的实例,使用列表字段的多选小部件。因此,我创建了一些自定义类如下

class ModelListField(ListField):
    def formfield(self, **kwargs):
        return FormListField(**kwargs)

class ListFieldWidget(SelectMultiple):
    pass

class FormListField(MultipleChoiceField):
    """
    This is a custom form field that can display a ModelListField as a Multiple Select GUI element.
    """
    widget = ListFieldWidget

    def clean(self, value):
        #TODO: clean your data in whatever way is correct in your case and return cleaned data instead of just the value
        return value

这些类允许在管理员中使用列表字段。然后我创建了一个在管理站点中使用的表单

class MyClassForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyClasstForm,self).__init__(*args, **kwargs)
        self.fields['field'].widget.choices = [(i.pk, i) for i in AnotherClass.objects.all()]
        if self.instance.pk:
            self.fields['field'].initial = self.instance.field

    class Meta:
        model = MyClass

完成此操作后,我创建了一个管理模型并将其注册到管理站点

class MyClassAdmin(admin.ModelAdmin):
    form = MyClassForm

    def __init__(self, model, admin_site):
        super(MyClassAdmin,self).__init__(model, admin_site)

admin.site.register(MyClass, MyClassAdmin)

这现在在我的代码中工作。请记住,这种方法可能根本不适合 google_appengine,因为我不太擅长它的工作原理,并且可能会产生低效的查询。

于 2011-06-08T18:17:07.737 回答
1

我不知道,但尝试:

class Choice_examples(models.Model):
    name = models.CharField(max_length='30')

    def __unicode__(self):
        return u'%s' % (self.name)

class Example(models.Model):
    some_choices = models.ListField(Choice_examples)
    notes = models.CharField(max_length='20')
    updated_at = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return u'%s' % (self.notes)
于 2010-10-08T16:45:13.130 回答
1

看起来答案是您不能将对象传递给 fields.ListField。

我已经放弃尝试使用 ListField,因为文档有限,而且我的编码技能还没有达到我可以解决的水平。

遇到类似问题的其他人,您应该考虑创建一个新模型来映射多对多关系。如果管理视图很重要,您应该查看以下内容以显示与任何给定管理视图内联的 ManyToMany 表:

http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#s-working-with-many-to-many-models

于 2010-10-12T12:46:50.747 回答