Django从查询集中填充form.ChoiceField字段,并将选择关联回模型对象

43T*_*cts 4 django django-forms choicefield

我有一个简单的形式:

class SubmissionQuickReplyForm(forms.Form):
    comment_text = forms.CharField(label='', required=False, widget=forms.Textarea(attrs={'rows':2}))
Run Code Online (Sandbox Code Playgroud)

我想在表单中添加一个form.ChoiceField,其中ChoiceField中的选项是从查询集中填充的.

class SubmissionQuickReplyForm(forms.Form):
        comment_text = forms.CharField(label='', required=False, widget=forms.Textarea(attrs={'rows':2}))
        choice = forms.ChoiceField(...)
Run Code Online (Sandbox Code Playgroud)

例如,如果我有:

q = MyChoices.Objects.all()
Run Code Online (Sandbox Code Playgroud)

如何用q的内容填充ChoiceField,这样当我在视图中处理表单的结果时,我可以在最后将对象取回?

    if request.method == "POST":
        form = SubmissionQuickReplyForm(request.POST)
        if form.is_valid():
            ch = get_object_or_404(MyChoices, pk=?)
            # How do I get my object from the choice form field?
Run Code Online (Sandbox Code Playgroud)

Adi*_*rak 18

您可以改用ModelChoiceField.

choice = forms.ModelChoiceField(queryset=MyChoices.Objects.all())
Run Code Online (Sandbox Code Playgroud)

你可以通过简单地这样打电话来获得cleaned_data.

if request.method == "POST":
    form = SubmissionQuickReplyForm(request.POST)
    if form.is_valid():
        ch = form.cleaned_data.get('choice')
Run Code Online (Sandbox Code Playgroud)

  • 应该是 `MyChoices.objects.all()` - 小写的对象:) (2认同)

Dim*_*zis 8

对于ChoiceField,您可以使用

    choice = forms.ChoiceField(choices=[
    (choice.pk, choice) for choice in MyChoices.objects.all()])
Run Code Online (Sandbox Code Playgroud)

  • ^ 不要这样做——它只会在模块加载时被评估,这意味着选项不会随着数据的变化而更新。 (7认同)