ModelChoiceField не показывает варианты ForeignKey - PullRequest
8 голосов
/ 06 августа 2020

Я хочу показать раскрывающийся список в форме Django, где элементы раскрывающегося списка указаны в другой модели в другом приложении. Вот что я имею в виду:

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()

С приведенным выше кодом раскрывающееся поле отображается правильно; однако он пуст. введите описание изображения здесь

Мы приветствуем любые идеи или предложения.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 09 августа 2020

Пожалуйста, измените поле user_title на это и попробуйте это.

user_title = forms.ModelChoiceField(queryset=Title.objects.all(), widget=forms.Select(attrs={'class': 'form-control'}))
1 голос
/ 13 августа 2020

Если вы собираетесь создать все варианты в TITLE_CHOICES, которые вы объявили, я бы просто сделал приспособление и загрузил его в базу данных.

Я бы немного изменил модель: 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

затем создайте файл json: 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"
        }
    },
    ...
]

Затем загрузите этот json файл в базу данных командой python manage.py loaddata titles. Это автоматически создаст все экземпляры в json файле в базе данных.

Обратите внимание, что вы должны сохранить файл в папке с именем fixtures, иначе он вернет ошибку.

Теперь при создании пользователь, которого вы получите Название ForeignKey, будет отображать title_name в списке параметров вместо title.

0 голосов
/ 15 августа 2020
user_title = forms.ModelChoiceField(queryset=Title.objects.all(), flat=True)
...