Отображение значения опции и текста для выбора

У меня есть поле select, заполняемое из таблицы базы данных 'Grade'. Оно отображает объекты Grade вместо 'Grade 1', 'Grade 2', 'Grade 3' и т.д. Как я могу заполнить select, чтобы отобразить тексты. Current Output

Мои коды:

models.py

class Grade(models.Model):
    grade_id = models.AutoField(primary_key=True)
    grade_name = models.CharField(max_length=10, default="")
    class Meta:
        db_table = 'grade'


class Student(models.Model):
    student_id = models.AutoField(primary_key=True)
    first_name = models.CharField(max_length=50, default="")
    last_name = models.CharField(max_length=50, default="")
    grade = models.ForeignKey(Grade, on_delete=models.CASCADE)
    class Meta:
        db_table = 'Student'

forms.py

class CreateStudentForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = ['grade', 'first_name', 'last_name' ]
        widgets = {
            'grade': forms.Select(choices=Grade.objects.all(), attrs={'id':'selectGrade', 'class': 'form-control'}),
            'first_name': forms.TextInput(attrs={'id':'txtFirstName', 'class': 'form-control', 'placeholder': 'First Name'}),
            'last_name': forms.TextInput(attrs={'id':'txtLastName', 'class': 'form-control', 'placeholder': 'Last Name'}),
        }

views.py

def student_action(request):
    form = CreateStudentForm()
    return render(request, 'student.html', {'form': form})

Вам нужно написать метод str для представления имени оценки вместо имени объекта, как это ...

models.py

class Grade(models.Model):
    grade_id = models.AutoField(primary_key=True)
    grade_name = models.CharField(max_length=10, default="")
    class Meta:
        db_table = 'grade'
    
    def __str__(self):
        return self.grade_name

Вы должны определить метод __str__() в модели так:

class Grade(models.Model):
    grade_id = models.AutoField(primary_key=True)
    grade_name = models.CharField(max_length=10, default="")

    def __str__(self):
        return f"{self.grade_name}"

    class Meta:
        db_table = 'grade'

Как отобразить Select Grade вместо - - - - - - - -?

Вы можете переопределить метод __init__() ModelForm таким образом:

class CreateStudentForm(forms.ModelForm):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['grade'].empty_label = 'Select Grade'
    
    class Meta:
        model = Student
        fields = ['grade', 'first_name', 'last_name' ]
        widgets = {
            'grade': forms.Select(choices=Grade.objects.all(), attrs={'id':'selectGrade', 'class': 'form-control'}),
            'first_name': forms.TextInput(attrs={'id':'txtFirstName', 'class': 'form-control', 'placeholder': 'First Name'}),
            'last_name': forms.TextInput(attrs={'id':'txtLastName', 'class': 'form-control', 'placeholder': 'Last Name'}),
        }    
Вернуться на верх