1

django-nonrelを使用してGoogleAppEngineでサンプルアプリを作成しようとしています。ListField属性をモデルに実装する際に問題が発生しています。

アプリtest_modelを作成し、インストール済みアプリとして設定に含めました。model.pyは次のとおりです。

django.dbインポートモデルから
djangotoolboxインポートから*
dbindexerインポートから*

#ここでモデルを作成します。
クラス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):
        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を使用する方法についてのドキュメントが見つからないようです。それは本当に明白なはずだからですか?

4

4 に答える 4

4

あなたの輸入品はお互いを壊しています:

from django.db import models
from djangotoolbox import *

2番目のインポートでは、django.dbモデルがdjangotoolboxの空のモデルモジュールに置き換えられます。使用するfrom X import *ことは、Pythonで一般的にひどい考えであり、このような紛らわしい結果を生み出します。

djangotoolboxのListFieldを使用する場合は、次を使用します。

from djangotoolbox import fields

ListFieldクラスを。として参照しfields.ListFieldます。

于 2010-10-08T20:42:05.110 に答える
3

OK、これがListFieldsを使用できるようにするために私がしたことです。あなたのクラスMyClassに相当し、あなたのと同じです。私が説明することにより、管理インターフェースと自己実装ビューでsを使用できるようになります。ExampleAnotherClassChoice_examplesListField

最初から始めます

これは私のモデルがどのように見えるかです

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関係をマップするための新しいモデルを作成することを検討する必要があります。また、管理ビューが重要な場合は、以下を調べて、ManyToManyテーブルを特定の管理ビューとインラインで表示する必要があります。

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

于 2010-10-12T12:46:50.747 に答える