Google App Engine ListField中的Django-nonrel

时间:2010-10-07 23:47:42

标签: google-app-engine listfield django-nonrel

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

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

from django.db import models
from djangotoolbox import *
from dbindexer import *

# Create your models here.
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)


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

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

上面的例子给了我:
AttributeError:'module'对象没有属性'Model'

如果我注释掉djangotoolbox导入,我会得到以下内容:
AttributeError:'module'对象没有属性'ListField'

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

4 个答案:

答案 0 :(得分:4)

你的进口相互粉碎:

from django.db import models
from djangotoolbox import *

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

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

from djangotoolbox import fields

并将ListField类称为fields.ListField

答案 1 :(得分:3)

好的,我这样做是为了能够使用ListFields。与您的MyClass班级相同的ExampleAnotherClass与您的Choice_examples相同。我所描述的将允许您在管理界面中使用ListField和您自己实现的视图。

我将从头开始

这就是我的模型的样子

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

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

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,因为我不是很擅长它的工作原理,它可能会创建效率低下的查询。

答案 2 :(得分: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)

答案 3 :(得分:1)

看起来答案是你无法将对象传递给fields.ListField。

我已经放弃了尝试使用ListField,因为文档是有限的,我的编码技能不是我能够解决的问题。

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

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