2012-02-17 9 views
5

Django管理者のインライン・リレーショナル・アイテムと同様のものを使用して、ListFieldの組み込みモデルを表現できますか?Django-nonrelでListFieldを表すインラインを実装する

例えば、私は次のモデルを持っている:

class CartEntry(model.Model): 
    product_name=model.CharField(max_length=20) 
    quantity = model.IntegerField() 

class Cart(model.Model): 
    line_items = ListField(EmbeddedModelField('CartEntry')) 

私は、標準のインライン化を使用してみましたが、私はそれは適切ではないことを知っている:

class CartEntryInline(admin.StackedInline): 
    model=CartEntry 

class CartAdmin(admin.ModelAdmin) 
    inlines=[CartEntryInline] 

しかし、明らかにそれは」doesnの外部キーの関係がないので、作業しないでください。 django-nonrelでこれを行う方法はありますか?

答えて

0

これは、そのままでは簡単ではありません。 Djangoの管理モジュールでListFieldとEmbeddedModelFieldの型フィールドを管理し、それを行うためにいくつかのハッキングを行う必要があります。あなたは、それは、Djangoの管理者で動作するようにEmbeddedModelFieldオブジェクトを処理するクラスを定義する必要が

Use EmbeddedModelField in Django's admin

:次の2つの部品を実装する必要があります。 Hereは素晴らしいサンプルコードを見つけるためのリンクです。

あなたmodels.pyファイルにこのクラスを追加し、CartモデルにEmbedOverrideField代わりのEmbeddedModelFieldを使用します:

class ObjectListField(forms.CharField): 
    def prepare_value(self, value): 
     pass # you should actually implement this method 

    def to_python(self, value): 
     pass # Implement this method as well 
:2つのメソッドを持っていること forms.py

class EmbedOverrideField(EmbeddedModelField): 
    def formfield(self, **kwargs): 
     return models.Field.formfield(self, ObjectListField, **kwargs) 

は、クラスを実装し、以下のデモンストレーションのためだけのコードブロックがあります

Use ListFields in Django's admin

また、ListFieldオブジェクトを扱うクラスを定義して、Djangoの管理者と連携させる必要があります。 Hereは素晴らしいサンプルコードを見つけるためのリンクです。次のデモのためだけのコードブロックです:

ではなくListFieldCartでモデルのごmodels.pyファイルとItemsFieldにこのクラスを追加します。

class StringListField(forms.CharField): 
    def prepare_value(self, value): 
     pass # you should actually implement this method 

    def to_python(self, value): 
     pass # Implement this method as well 

class ItemsField(ListField): 
    def formfield(self, **kwargs): 
     return models.Field.formfield(self, StringListField, **kwargs) 

を二つの方法がありますforms.pyでクラスを実装

関連する問題