Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

199
Views
ModelChoiceField does not show ForeignKey choices

I want to show a dropdown in Django Form where the dropdown items are specified in another model in another app. Here's what I mean:

title/models.py

TITLE_CHOICES = (
    ('MR', 'Mr'),
    ('MS', 'Ms'),
    ('MISS', 'Miss'),
    ('MRS', 'Mrs'),
    ('MX', 'Mx'),
)

class Title(models.Model):
    title_name = models.CharField(max_length=10, choices=TITLE_CHOICES)

    def __str__(self):
        return self.title_name

user/models.py

class User(models.Model):
    ...
    user_title = models.ForeignKey('title.Title', on_delete=models.CASCADE)
    ...

user/forms.py

class SignupForm(forms.ModelForm):
        user_title = forms.ModelChoiceField(queryset=Title.objects.all())

        class Meta:
            model = User
            fields = '__all__'

        def signup(self, request, user): #this is to override the **allauth** signup form
            user.user_title = self.cleaned_data['title_name']
            ...
            ...

            user.save()

With the above code, the dropdown field renders properly; however, it is empty. enter image description here

Any ideas or suggestions are greatly appreciated.

Thanks.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Please change your user_title field to this and Try this.

user_title = forms.ModelChoiceField(queryset=Title.objects.all(), widget=forms.Select(attrs={'class': 'form-control'}))
over 4 years ago · Santiago Trujillo Report

0

If you are going to create all of the choices in TITLE_CHOICES you declared, I would just make a fixture and load it to database.

I would change the model a bit: title.models

def Title(models.Model):
    title_name = models.CharField(max_length=10)
    title = models.CharField(max_length=10)

    def __str__(self):
        return self.title_name

then make a json file: title/fixtures/titles.json

[
    {
        "model": "title.Title",
        "pk": 1,
        "fields": {
          "title_name": "MR",
          "title" : "Mr"
        }
    },
    {
        "model": "title.Title",
        "pk": 2,
        "fields": {
          "title_name": "MS",
          "title" : "Ms"
        }
    },
    ...
]

Then load this json file to database by python manage.py loaddata titles command. This will automatically create all instances in json file to database.

Note that you have to save the file in a folder named fixtures otherwise it returns error.

Now while creating the user you will get the Title ForeignKey will show the title_name in options list instead of the title.

over 4 years ago · Santiago Trujillo Report

0

user_title = forms.ModelChoiceField(queryset=Title.objects.all(), flat=True)
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!