实现内联以表示Django-nonrel中的ListField

时间:2012-02-17 01:15:18

标签: python django mongodb django-nonrel nosql

是否可以使用类似于Django管理员的内联关系项来表示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]

但显然这不起作用,因为没有外键关系。在django-nonrel中有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

开箱即用并不容易。您将需要在Django的管理模块中管理ListField和EmbeddedModelField类型字段,并进行一些黑客攻击以完成它。您必须实施两个部分:

<强> Use EmbeddedModelField in Django's admin

您需要定义一个处理EmbeddedModelField对象的类,以使其与Django的管理员一起使用。 Here是一个链接,您可以在其中找到很棒的示例代码。以下是演示的代码块:

将此课程添加到您的models.py文件中,并在EmbedOverrideField模型中使用EmbeddedModelField代替Cart

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

forms.py中实现一个有两种方法的类:

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

<强> Use ListFields in Django's admin

您还需要定义一个处理ListField对象的类,以使其与Django的管理员一起使用。 Here是一个链接,您可以在其中找到很棒的示例代码。以下是演示的代码块:

models.py模型中将此课程添加到ItemsField文件和ListField而不是Cart

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

forms.py中实现一个有两种方法的类:

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