Отображение значения опции и текста для выбора
У меня есть поле select, заполняемое из таблицы базы данных 'Grade'. Оно отображает объекты Grade вместо 'Grade 1', 'Grade 2', 'Grade 3' и т.д. Как я могу заполнить select, чтобы отобразить тексты.
Мои коды:
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'}),
}