0

我想创建一个 Django 下拉菜单,将字符串“-- Select --”作为默认选项。当用户单击下拉小部件时,他们将看到三个选项,他们必须选择其中之一:

-- Select --          <= default choice visible
95th percentile       <= other choices
75th percentile       <= other choices
50th percentile       <= other choices

我创建了一个 Django Student 模型和相关的 Percentile 查找模型:

class Student(models.Model):
    student = models.ForeignKey(User)
    student_percentile = models.ForeignKey(Percentile)

class Percentile(models.Model):
    # Contains "-- Select --", "95th Percentile", etc., etc.
    ranking = models.CharField(max_length=15)

    def __unicode__(self):
        return ranking

Student 表单只是一个 Django ModelForm:

from django import forms
from app.models import Student

class StudentForm(forms.ModelForm)
    class Meta:
        model = Student
    # Custom form validator for student form will go here

我的想法是,我将在 StudentForm 中创建一个自定义验证器,该验证器将检查用户是否选择了索引大于 1 的百分比排名值,因为 Percentile 表的排名列中的第一行包含“-- Select --”字符串。这是在 Django 中实现这种下拉菜单的正确方法吗?我意识到我可以创建一个包含排名的 RANKING_CHOICES 变量,如果我使用 Django 表单而不是 ModelForm,然后将排名设置为 ChoiceField。但是,在这种情况下,我使用 Student 和 Percentile 之间的外键关系,所以我认为这种方法不适用。尽管我展示的方法有效,但对我来说似乎不是很“干净”,因为“选择”确实不是百分位排名值。

谢谢!

4

2 回答 2

1

你可以这样做:

class StudentForm(forms.ModelForm)
    student_percentile = forms.ModelChoiceField(queryset= Percentile.objects.all(), empty_label="--Select--")

    class Meta:
        model = Student
于 2013-08-21T17:12:52.097 回答
0

假设百分位选项列表不经常改变,这篇博文提供了一个很好的方法来做你正在讨论的事情。

http://www.b-list.org/weblog/2007/nov/02/handle-choices-right-way/

它描述了使用选择元组并将其提供给 CharField (或者根据 Joseph Paetz 上面的评论,您可以使用 IntegerField 进行更有效的排序和聚合,因此您不会将真正的数值存储为文本)。

具体来说,您可以添加一个“--Select--”选项作为第一个选项,可能值为“-1”或类似的值,这样您就可以在提交表单时验证该值。如果它是-1,他们没有选择任何东西。

PERCENTILE_CHOICES = (
    (-1, '--Select--'),
    (95, '95th Percentile'),
    (80, '80th Percentile'),
...etc...
)
于 2013-08-21T17:42:25.077 回答