0

I have a model (parentmodel) which is having a EmbeddedModelField (embedmodel). This is basically a document in MongoDB. Below is the Model classes

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'

And this is how my document in mongodb looks like

{
    'name': 'rule1',
    'type': 'static',
    'enabled': True,
    'rule': {
        'sendto': 'external',
        'sendtouser': 'sam',
        'sendtogroup': 'vendor'
    }
}

I am trying to create a form which helps me create new rules and this is what i have in forms.py where i want to customize the form fields as well.

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']

How to do customize the fields being displayed from embedmodel? I tried the below but no luck.

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']

and

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']
Poula Adel
  • 609
  • 1
  • 10
  • 33
Somesh Garje
  • 105
  • 11
  • I am having the same problem. Did you solve it? – Nisha Jul 19 '19 at 07:37
  • Yes I was able to solve it. https://medium.com/@SiddyZen/create-embedded-models-using-django-admin-3ecc38a00879 - Section with heading The ‘embedded model’. All I had to do is create a ModelForm (Say the name would be embedmodelForm) in models.py for the embedmodel and in parentmodel i gave rule = models.EmbeddedModelField(model_container=embedmodel, model_form_class=embedmodelForm). Then you can go ahead and edit the UI part in embedmodelForm. Also dont forget to import django.forms in models.py – Somesh Garje Jul 19 '19 at 07:45

1 Answers1

1

I was able to solve this by following https://medium.com/@SiddyZen/create-embedded-models-using-django-admin-3ecc38a00879 (in Section with heading The ‘embedded model’)Thanks to the author SiddyZen :). Did the below change in 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'
Somesh Garje
  • 105
  • 11