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

时间:2019-07-16 08:39:11

标签: django mongodb django-models django-forms djongo

我有一个模型(父模型),其中有一个EmbeddedModelField(嵌入模型)。这基本上是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']

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)
embedmodel.sendto = forms.ChoiceField(widget=forms.Select, choices=[(1, 'External'), (2, 'Internal')])
embedmodel.sendtouser = forms.CharField(max_length=30, required=False)
embedmodel.sendtogroup = forms.CharField(max_length=30, required=False)
class Meta:
    model = Rules
    fields = ['name', 'type', 'enabled', 'rule']

1 个答案:

答案 0 :(得分:1)

通过遵循http://some-ip:3000(在标题为“嵌入式模型”的部分中),作者的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'