Django 使用EmbeddedModelField创建ModelForm并在EmbeddedModelField中自定义字段

Django 使用EmbeddedModelField创建ModelForm并在EmbeddedModelField中自定义字段,django,mongodb,django-models,django-forms,djongo,Django,Mongodb,Django Models,Django Forms,Djongo,我有一个模型(parentmodel),它有一个EmbeddedModelField(EmbeddedModel)。这基本上是MongoDB中的一个文档。下面是模型类 class embedmodel(models.Model): sendto = models.CharField(max_length=10) sendtouser = models.CharField(max_length=15) sendtogroup = models.CharField(max_l

我有一个模型(parentmodel),它有一个EmbeddedModelField(EmbeddedModel)。这基本上是MongoDB中的一个文档。下面是模型类

class embedmodel(models.Model):
    sendto = models.CharField(max_length=10)
    sendtouser = models.CharField(max_length=15)
    sendtogroup = models.CharField(max_length=15)

    class parentmodel(models.Model):
    name = models.CharField(max_length=30, unique=True, primary_key=True)
    type = models.CharField(max_length=11)
    enabled = models.BooleanField()
    rule = models.EmbeddedModelField(model_container=embedmodel)

    class Meta:
        managed = False
        db_table = 'parentmodel'
这就是我在mongodb中的文档的样子

{
    'name': 'rule1',
    'type': 'static',
    'enabled': True,
    'rule': {
        'sendto': 'external',
        'sendtouser': 'sam',
        'sendtogroup': 'vendor'
    }
}
我正在尝试创建一个表单,它可以帮助我创建新的规则,这就是我在forms.py中所拥有的,我想在其中自定义表单字段

class RulesForm(forms.ModelForm):
    name = forms.CharField(max_length=30, required=True)
    type = forms.CharField(max_length=11, required=True)
    enabled = forms.BooleanField(widget=forms.CheckboxInput)

    class Meta:
        model = parentmodel
        fields = ['name', 'type', 'enabled', 'rule']
如何自定义从embedmodel显示的字段?我试过下面的方法,但没有成功

class RulesForm(forms.ModelForm):
    name = forms.CharField(max_length=30, required=True)
    type = forms.CharField(max_length=11, empty_value="UserDefined", required=True
    enabled = forms.BooleanField(widget=forms.CheckboxInput)
    sendto = forms.ChoiceField(widget=forms.Select, choices=[(1, 'External'), (2, 'Internal')])
    sendtouser = forms.CharField(max_length=30, required=False)
    sendtogroup = forms.CharField(max_length=30, required=False)
    class Meta:
        model = Rules
        fields = ['name', 'type', 'enabled', 'rule']


多亏了作者SiddyZen,我通过以下方式(在标题为“嵌入式模型”的部分)解决了这个问题:)。models.py中是否更改了以下内容

from django import forms

class embedmodel(models.Model):
sendto = models.CharField(max_length=10)
sendtouser = models.CharField(max_length=15)
sendtogroup = models.CharField(max_length=15)

class embedmodelForm(forms.ModelForm):
    sendto = forms.ChoiceField(widget=forms.Select, choices=[(1, 'External'), (2, 'Internal')])
    sendtouser = forms.CharField(max_length=15, required=False)
    sendtogroup = forms.CharField(max_length=15, required=False)
    class Meta:
        model = embedmodel
        fields = ['sendto', 'sendtouser', 'sendtogroup']

class parentmodel(models.Model):
name = models.CharField(max_length=30, unique=True, primary_key=True)
type = models.CharField(max_length=11)
enabled = models.BooleanField()
rule = models.EmbeddedModelField(model_container=embedmodel, model_form_class=embedmodelForm)
    class Meta:
    managed = False
    db_table = 'parentmodel'

我也有同样的问题。你解决了吗?是的,我能解决标题为“嵌入式模型”的部分。我所要做的就是在models.py中为EmbeddedModel和parentmodel创建一个ModelForm(比如名称为EmbeddedModelForm),我给rule=models.EmbeddedModelField(model\u container=EmbeddedModel,model\u form\u class=EmbeddedModelForm)。然后,您可以继续在embedmodelForm中编辑UI部分。另外,别忘了在models.py中导入django.forms。非常感谢!转眼间就解决了我的问题。
from django import forms

class embedmodel(models.Model):
sendto = models.CharField(max_length=10)
sendtouser = models.CharField(max_length=15)
sendtogroup = models.CharField(max_length=15)

class embedmodelForm(forms.ModelForm):
    sendto = forms.ChoiceField(widget=forms.Select, choices=[(1, 'External'), (2, 'Internal')])
    sendtouser = forms.CharField(max_length=15, required=False)
    sendtogroup = forms.CharField(max_length=15, required=False)
    class Meta:
        model = embedmodel
        fields = ['sendto', 'sendtouser', 'sendtogroup']

class parentmodel(models.Model):
name = models.CharField(max_length=30, unique=True, primary_key=True)
type = models.CharField(max_length=11)
enabled = models.BooleanField()
rule = models.EmbeddedModelField(model_container=embedmodel, model_form_class=embedmodelForm)
    class Meta:
    managed = False
    db_table = 'parentmodel'