Как получить идентификатор внешнего ключа
Я пытаюсь автозаполнить эти поля, если выбран внешний ключ
Базовый класс:
class ScreeningCamp(models.Model):
beneficiary=models.ForeignKey(Beneficiary,on_delete=models.CASCADE)
name=models.CharField(max_length=200,default=Beneficiary.objects.get(id=beneficiary.id).name,blank=True)
dob=models.DateField(default=Beneficiary.objects.get(id=beneficiary.id).dob,blank=True)
gender=models.CharField(max_length=200,choices=GENDER_CHOICES,default=Beneficiary.objects.get(beneficiary.id).gender,blank=True)
fatherName=models.CharField(max_length=200)
motherName=models.CharField(max_length=200)
careGiver=models.CharField(max_length=200,default=Beneficiary.objects.get(id=beneficiary.id).careGiversName,blank=True,null=True)
relationship=models.CharField(max_length=200,choices=RELATIONSHIP_CHOICES,default=Beneficiary.objects.get(id=beneficiary.id).relationship,blank=True,null=True)
address=models.TextField(Beneficiary.objects.get(id=beneficiary.id).address,blank=True,null=True)
village=models.CharField(max_length=200,default=Beneficiary.objects.get(id=beneficiary.id).village,blank=True,null=True)
phone=models.CharField(max_length=13,blank=True,null=True,default=Beneficiary.objects.get(id=beneficiary.id).phone,)
designation=models.CharField(max_length=200,choices=DESIGNATION_CHOICES,default=Beneficiary.objects.get(id=beneficiary.id).designation,blank=True,null=True)
disability=models.CharField(max_length=200,choices=DISABILITY_CHOICES)
visitedBy=models.CharField(max_length=200)
def __str__(self):
return self.name
Родительский класс:
class Beneficiary(models.Model):
image=models.ImageField(upload_to='home/images/',blank=True,null=True)
name = models.CharField(max_length=200)
gender=models.CharField(max_length=6,choices=GENDER_CHOICES,default='male')
dob=models.DateField()
registrationDate=models.DateField()
uidOrAadhaar=models.CharField(blank=True,max_length=12,null=True)
careGiversName=models.CharField(max_length=200,blank=True,null=True)
reletionship=models.CharField(max_length=200,choices=RELATIONSHIP_CHOICES,default='other',blank=True,null=True)
beneficiaryType=models.CharField(max_length=200,choices=BENIFICIARY_TYPE_CHOICES,default='active')
statusOfBeneficiary=models.CharField(max_length=200,choices=STATUS_OF_BENIFICIARY_CHOICES,default='red')
address=models.TextField(blank=True,null=True)
district=models.CharField(max_length=200,blank=True,null=True)
city=models.CharField(max_length=200)
pinCode=models.CharField(max_length=200,blank=True,null=True)
addressType=models.CharField(max_length=200,choices=ADDRESS_TYPE_CHOICES,blank=True,null=True)
phone=models.CharField(max_length=13,blank=True,null=True)
email=models.EmailField(blank=True,null=True)
diagonisis=models.CharField(max_length=200,choices=DIAGONISIS_CHOICES)
diagnosedBy=models.CharField(max_length=200,choices=DIAGNOSED_BY_CHOICES,default="")
informedBy=models.CharField(max_length=200,default='')
designation=models.CharField(max_length=200,choices=DESIGNATION_CHOICES,default="")
symptomsAsInformed=models.TextField(blank=True,null=True)
educationHistory=models.CharField(max_length=200,choices=EDUCATION_HISTORY_CHOICES)
maritialStatus=models.CharField(max_length=200,choices=MARTIAL_STATUS_CHOICES,blank=True,null=True)
occupation=models.CharField(max_length=200,blank=True,null=True)
skill=models.CharField(max_length=200,blank=True,null=True)
birth=models.CharField(max_length=200,choices=BIRTH_CHOICES,blank=True,null=True)
durationOfIllness=models.CharField(max_length=200,choices=DURATION_OF_ILLNESS_CHOICES,blank=True,null=True)
pastPyschiatricIllness=models.CharField(max_length=200,choices=PAST_PYSCHIATRIC_ILLNESS_CHOICES,blank=True,null=True)
gp=models.CharField(max_length=200)
village=models.CharField(max_length=200)
family_history_of_MI_present_or_absent=models.BooleanField(default=False)
if_present_schizophrenia_or_mania_or_depression=models.BooleanField(default=False)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "Beneficiaries"
Я просто хочу автозаполнять имя, дату и т.д. из класса бенефициара, когда выбран внешний ключ
Когда он не выбран, мы должны сделать это вручную
Думаю, простое получение id выбранного объекта поможет
Может ли кто-нибудь сказать мне, как это сделать?
По сути, вы хотите создать запись ScreeningCamp с данными, которые используются при создании записи Beneficiary.
Пример: возьмем только поля name и dob.
beneficiary_1 = Beneficary(name='test1',dob=2006-10-02)
тогда в таблице ScreeningCamp будет создана строка с тем же именем, dob и отношением внешнего ключа к beneficary_1.
Вы можете достичь этого, используя сигналы Django.
models.py Давайте пока возьмем только имя и дату рождения.
Модели на models.py
class Beneficiary(models.Model):
name = models.CharField(max_length=200)
dob = models.DateField()
class ScreeningCamp(models.Model):
beneficiary = models.ForeignKey(Beneficiary, on_delete=models.CASCADE)
name = models.CharField(max_length=200, blank=True)
dob = models.DateField(blank=True)
Предполагается, что модели объявлены в файле models.py того же приложения. Создайте файл signals.py в приложении, которое получает сигнал post_save при создании записи Beneficiary. Назовем приложение Post.
from django.db.models.signals import post_save
from django.dispatch import receiver
from . import models
@receiver(post_save, sender=models.Beneficiary)
def create_screening_camp(sender, instance, created, **kwargs):
if not created:
return
# Create the ScreeningCamp object, only if it is newly created
screening_camp = models.ScreeningCamp(name=instance.name, beneficiary=instance, dob=instance.dob)
screening_camp.save()
на вашем apps.py
from django.apps import AppConfig
class PostConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'Post'
def ready(self):
from . import signals
в settings.py installed_apps, include
INSTALLED_APPS = [
...
'Post.apps.PostConfig',
]
Если вы вызываете ScreeningCamp, Django может искать Foreignkey. Вот пример:
screening_camp = ScreeningCamp.objects.get(pk=1)
name = screening_camp.beneficiary.name
gender = screening_camp.beneficiary.gender
dob = screening_camp.beneficiary.dob
# populating form
form = ScreeningCampForm(initial={"name": name, "gender": gender, "dob":dob}, instance=screening_camp)
return render(request, "form.html", {"form": form})