【问题标题】:Django-nonrel in Google App Engine ListFieldGoogle App Engine ListField 中的 Django-nonrel
【发布时间】:2011-04-22 15:39:47
【问题描述】:

我正在尝试使用 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'对象没有属性'Model'

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

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

【问题讨论】:

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


    【解决方案1】:

    你们的进口正在互相粉碎:

    from django.db import models
    from djangotoolbox import *
    

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

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

    from djangotoolbox import fields
    

    并将 ListField 类称为fields.ListField

    【讨论】:

    • 感谢 Greensnark。我想我快到了。现在收到错误:“str”对象没有属性“model”
    • 异常位置是:contribute_to_class 中的fields.py,第13 行
    【解决方案2】:

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

    我会从头开始

    这就是我的模型的样子

    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,因为我不太熟悉它的工作原理,并且可能会产生低效的查询。

    【讨论】:

      【解决方案3】:

      我不知道,但请尝试:

      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)
      

      【讨论】:

      • 感谢 Sahid 的建议,我尝试了收集到的更改,1) 重新排序类 2) 从 Choice_examples 中删除单引号。不幸的是,这些更改并没有解决它。
      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-06-01
        • 1970-01-01
        • 2011-04-22
        • 1970-01-01
        • 2011-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        相关资源
        最近更新 更多