Django表单:具有"选择"的默认值,其中"选择"源来自数据库

wen*_*ert 2 django django-forms

假设我在forms.py中有这个表单:

CATEGORY_CHOICES= ((1,'Cat1'), 
                (2,'Cat2'), 
                (3,'Cat3'), 
                (4,'Cat4'), 
               ) 

class AddMessageForm(forms.Form):
    title = forms.CharField(max_length=250)
    groupname = forms.CharField(widget=forms.HiddenInput) 
    categories = forms.ChoiceField(choices = CATEGORY_CHOICES, required=True) 
    body = forms.CharField(widget=forms.Textarea)
Run Code Online (Sandbox Code Playgroud)

现在,CATEGORY_CHOICES是"硬编码的".这有效,但我需要在views.py中添加CATEGORY_CHOICES - 我需要做一些dbqueries来获取每个组下的"类别".

我该怎么做?

PS:我设法通过做这样的事情对我的views.py中的HiddenInput(groupname)做了同样的事情:

form = AddMessageForm(
            initial={'groupname': groupname},
        )
Run Code Online (Sandbox Code Playgroud)

我希望我明白我的问题.任何澄清等,请添加评论.

问候.w ^

Yuj*_*ita 5

在表单构造中设置选项

class AddMessageForm(forms.Form):
....
    def __init__(self, *args, **kwargs):
        self.fields['categories'].choices = \ 
            [(x.id, x.title) for x in MyObject.objects.all()]
        super(AddMessageForm, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

如果你真的想在views.py中这样做,那么方法是一样的.

myform.fields['categories'].choices = \
    [(x.id, x.title) for x in Category.objects.all()]
Run Code Online (Sandbox Code Playgroud)