2013-08-21 139 views
0

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

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

我创建了一个Django的学生模型和相关百分查找模型:

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 

学生的形式只是一个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 Form而不是ModelForm,然后排名为ChoiceField。但是,在这种情况下,我使用Student和Percentile之间的外键关系,所以我认为这种方法不适用。虽然我所展示的方法很有效,但对我来说这似乎并不“干净”,因为“选择”的确不是百分位排名值。

谢谢!

+0

您仍然可以使用CharField将选择附加到ModelForm。并向选择插入(0,('select','select'))。 –

+0

绝对不要放在你的百分点模型中(请参阅@ srinivas-reddy-thatiparthy替代)。您可能需要进行第二次查看,然后决定是否真的需要百分位数模型......如果您将其保留为模型,则可能会发现该排名最好以整数/小数而非字符串形式存储。 –

+0

谢谢Srinivas。并感谢约瑟夫。做我提议的“闻起来很糟糕”。很高兴你能够证实这一点。 – William

回答

1

你可以这样做:

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

    class Meta: 
     model = Student 
+0

谢谢karthikr。这似乎是一个很好的干净的解决方案,它利用了Django的ModelForm特性。 – William

0

假设百分位选择的列表不经常更改,这篇博客文章给出了做你正在谈论什么好方法。

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

它描述了使用的选项的元组,并将其输送到一个CharField(或者根据上面约瑟夫Paetz的评论,你可以使用一个IntegerField更有效的排序和聚集,这样你就不会存储什么是真正的数值作为文字)。

对于您的案例,您可以只添加'--Select--'选项作为第一个选项,可能值为'-1'或类似的值,因此您可以在表单上验证该值已提交。如果它是-1,他们没有选择任何东西。

PERCENTILE_CHOICES = (
    (-1, '--Select--'), 
    (95, '95th Percentile'), 
    (80, '80th Percentile'), 
...etc... 
) 
+0

感谢您将我转到该文章。在这种情况下,我更喜欢Karthikr的解决方案,但后来我可以看到自己使用该文章。 – William