Исходные данные не работают, если я скрываю некоторые поля "один ко многим" в django

Я хочу заполнить некоторые поля от одного до многих, а также скрыть эти поля, потому что я хочу избежать сценария, когда пользователь может видеть все записи, связанные с этими полями. Проблема в том, что когда я использую 'all' на полях формы, словарь исходных данных работает хорошо, но если я пытаюсь скрыть некоторые поля, исходные данные не попадают в форму.

Вот мой models.py

class Agent(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = OneToOneField(User, null=True, blank=True, on_delete=models.SET_NULL)
first_name = models.CharField(max_length=15, null=True, blank=True,)
surname = models.CharField(max_length=15, null=True, blank=True,)
provcoord = models.ForeignKey(Provcoord, null=True, blank=True, on_delete=SET_NULL)
regcoord = models.ForeignKey(Regcoord, null=True, blank=False, on_delete=SET_NULL)
region = models.CharField(max_length=15, null=False, blank=True, choices=REGION)
province = models.CharField(max_length=15, null=False, blank=False, choices=PROVINCE)
id_no = id_no = models.CharField(max_length=10, null=False, blank=False, unique=True,)
agent_no = models.CharField(default="Not Assigned", max_length=20, null=False, blank=False)
address = models.TextField(null=False, blank=False)
gender = models.CharField(max_length=20, null=False, blank=False, choices=GENDER)
profile_pic = models.ImageField(upload_to="assets", default="default.png")
is_blacklisted = models.BooleanField(default=False)
reason_for_blacklist = models.TextField(max_length=500, null=True, blank=True)
registered_at = models.DateTimeField(auto_now_add=True)

def get_absolute_url(self):
       return reverse("agent", kwargs={'str' :str.id})

def __str__(self):
       return self.user.username

class Adult(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
   agent = models.ForeignKey(Agent, null=True, blank=True, on_delete=SET_NULL)
   regcoord = models.ForeignKey(Regcoord, null=True, blank=True, on_delete=SET_NULL)
   provcoord = models.ForeignKey(Provcoord, null=True, blank=True, on_delete=SET_NULL)
   surname = models.CharField(max_length=150, null=False, blank=False)
   first_name = models.CharField(max_length=150, null=False, blank=False)
   other_name = models.CharField(max_length=150, null=True, blank=True)
   address = models.CharField(max_length=200, null=True, blank=True)
   region = models.CharField(max_length=15, null=True, blank=True,choices=PROVINCE)
   dob = models.CharField(max_length=10, null=False, blank=False)
   gender = models.CharField(max_length=20, null=False, blank=False, choices=GENDER)
   id_no = models.CharField(max_length=12, null=False, blank=False, unique=True)
   receipt_no = models.CharField(max_length=10, default="Not Receipted", null=True, 
blank=True)
   phone_no = models.CharField(max_length=20, null=False, blank=False,)
   marital_status = models.CharField(max_length=20, null=False, blank=False, choices=MARITAL_STATUS)

views.py

def add_parent(request,):
agent = request.user.agent
regcoord = request.user.agent.regcoord
provcoord = request.user.agent.provcoord
region = request.user.agent.region
province = request.user.agent.province
form = ParentForm(initial={
    'agent' :agent,
    'regcoord' :regcoord,
    'provcoord' :provcoord,
    'region' :region,
    'province' :province
    })


if request.method == 'POST':
    form = ParentForm(request.POST, request.FILES,)
if form.is_valid():
    form.save()
    return redirect('/')

context = {'form' :form}
return render(request, 'kyc/add_adult.html', context)

forms.py

class ParentForm(ModelForm):
class Meta:
    model = Adult
    fields = ['surname', 
    'first_name', 
    'other_name', 
    'address', 
    'dob', 
    'gender', 
    'id_no', 
    'receipt_no',
     'phone_no',
     'image'
     ]

Пожалуйста, помогите, как я могу обойти эту проблему. Спасибо!

Вот подход, который я предлагаю (хотя он не проверен):

from django import forms

class ParentForm(ModelForm):
    agent = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))
    regcoord = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))
    provcoord = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))
    region = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))
    province = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        super(ParentForm, self).__init__(*args, **kwargs)

        self.fields['agent'].initial = self.user.agent
        self.fields['regcoord'].initial = self.user.regcoord
        self.fields['provcoord'].initial = self.user.provcoord
        self.fields['region'].initial = self.user.region
        self.fields['province'].initial = self.user.province

    class Meta:
        model = Adult
        fields = ['surname', 
            'first_name', 
            'other_name', 
            'address', 
            'dob', 
            'gender', 
            'id_no', 
            'receipt_no',
            'phone_no',
            'image'
         ]

Обратите внимание, как я сослался на 5 полей (agent, regcoord, provcoord, region, province) как на дополнительные поля, объявив их как простые CharFields. Таким образом, они больше не отображаются из модели как выпадающие списки. Затем в методе __init__ я определяю начальные значения для каждого из полей.

Ваша функция add_parent должна стать:

def add_parent(request,):

    form = ParentForm(user=request.user)

    if request.method == 'POST':
        form = ParentForm(request.POST, request.FILES,)
        if form.is_valid():
            form.save()
            return redirect('/')

    context = {'form' :form}
    return render(request, 'kyc/add_adult.html', context)
Вернуться на верх