是否可以使用类似于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中有没有办法做到这一点?
答案 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