Why my model field doesn't read the value of its ForeignKey, it returns its object number instead?

Viewed 40

I created a model which has a field that I want to be a dynamic dropdown. I created another model and related them with a Foreign Key. Now everything works fine except the dropdown doesn't show the values from the other model, instead, it returns its numbered objects.

Here is my models.py:

from django.db import models
from django.core.validators import RegexValidator
from django.db.models.deletion import CASCADE

# Create your models here.

class Diagnosis(models.Model):
    diagnosis=models.CharField(max_length=30, blank=True)
    
class InitialData(models.Model):
    pattern = RegexValidator(r'RT\/[0-9]{4}\/[0-9]{2}\/[0-9]{4}', 'Enter RT Number properly!')
    pattern1 = RegexValidator(r'OOPL\/D\/00[0-9]', 'Enter Case Number properly!')
    case_number=models.CharField(max_length=10, primary_key=True, unique=True, validators=[pattern1], blank=True)
    date_of_admission=models.DateField(default=None)
    date_of_discharge=models.DateField(default=None)
    name=models.CharField(max_length=100, default=None)
    mr_uid=models.IntegerField(default=None)
    rt_number=models.CharField(max_length=15, blank=False, validators=[pattern], default=None)
    diagnosis=models.ForeignKey(Diagnosis, on_delete=CASCADE)

forms.py:

class TrackReportForm(ModelForm):
    class Meta:
        model=InitialData
        fields=('case_number', 'date_of_admission', 'date_of_discharge', 'name', 'mr_uid', 'rt_number', 'diagnosis')

class DiagnosisForm(ModelForm):
    class Meta:
        model=Diagnosis
        fields=('diagnosis',)

views.py:

def initialview(request):
    if request.method=='POST':
        fm_diagnosis=DiagnosisForm(request.POST)
        fm_initialdata=TrackReportForm(request.POST)
        if fm_diagnosis.is_valid() and fm_initialdata.is_valid:
            diagnosis=fm_diagnosis.save()
            initial=fm_initialdata.save(False)
            initial.diagnosis=diagnosis
            initial.save()
            fm_diagnosis=DiagnosisForm()
            fm_initialdata=TrackReportForm()
        return render(request, 'account/database.html', {'form1':fm_diagnosis, 'form2':fm_initialdata})
    else:
        fm_diagnosis=DiagnosisForm()
        fm_initialdata=TrackReportForm()
        return render(request, 'account/database.html', {'form1':fm_diagnosis, 'form2':fm_initialdata})

URLs:

from account import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('data/', views.initialview),
]

template:

<body>
    <form action="" method="post" novalidate>
        {% csrf_token %}
        {{form1.as_p}}
        {{form2.as_p}}
        <button type="submit">Save</button>
    </form>
</body>

SCREENSHOT OF THE PROBLEM

What needs to be changed?

1 Answers

You should implement the __str__ method to decide how to render the objects (Diagnosis in this case):

class Diagnosis(models.Model):
    diagnosis=models.CharField(max_length=30, blank=True)

    def __str__(self):
        return self.diagnosis
Related