我正在尝试使用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的文档。这是因为它应该是非常明显的吗?
答案 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
班级相同的Example
和AnotherClass
与您的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