Python 3.x 如何使用django表单显示带有预选数据的选择字段?

Python 3.x 如何使用django表单显示带有预选数据的选择字段?,python-3.x,django,Python 3.x,Django,我有一个django表单,有两个选项(是和否),在我的“创建页面”上,我可以呈现select字段来保存数据,它工作正常。当我尝试在“编辑页面”上使用该值时,该值不是与当前值一起预先选择的,如何在select输入字段上选择当前值 表格: class MyForm(forms.ModelForm): choose = forms.BooleanField( required=False, widget=forms.Select( ch

我有一个django表单,有两个选项(是和否),在我的“创建页面”上,我可以呈现
select
字段来保存数据,它工作正常。当我尝试在“编辑页面”上使用该值时,该值不是与当前值一起预先选择的,如何在
select
输入字段上选择当前值

表格:

class MyForm(forms.ModelForm):

    choose = forms.BooleanField(
        required=False,
        widget=forms.Select(
            choices=[(1, 'Yes'), (0, 'No')],
            attrs={'class': 'form-control'}
        )
    )

    class Meta:
        model = MyModel
调用视图进行编辑时:

class MyUpdateView(
    LoginRequiredMixin,
    SuccessMessageMixin,
    UpdateView,
):
    model = MyModel
    form_class = MyForm
    template_name = "my/template.html"
    success_url = reverse_lazy('my-url')
    success_message = 'Updated!'

    def get_object(self, queryset=None):
        data = super(MyUpdateView, self).get_object()
        if not data.user == self.request.user:
            raise Http404
        
        # data.choose is False

        return data
HTML
输入将始终为“1”(是),即使当前值为“0”(否)

HTML:

{{ form.choose }}
模型:

class MyModel(models.Model):

    choose = models.BooleanField(
        default=False,
        verbose_name='Cumulativo'
    )

将此添加到您的
MyUpdateView

initial = { 'choose': 1 }

您正在表单中定义自定义字段“choose”,它没有引用MyModel字段“choose”。这就是为什么您总是将第一个值“Y”作为默认值或在下拉列表中获取第一个值“Y”

如果要引用模型对象,只需在表单中使用self关键字即可

class MyForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['choose'].widget.attrs['class'] = 'form-control'

    class Meta:
        model = MyModel
        fields = ('__all__')

问题不在于初始值,而是表单需要使用来自模型的值:)如果模型包含“1”,则所选值应为“是”,否则为“否”,我知道,您可以发布您的模型吗?是的,没有问题。这不提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-您没有包括
BenefitForm
,但它用于编辑外观。这对初始数据或字段值有影响吗?当实例加载到表单中时,您确认了实例上的值吗?很抱歉,这是一个输入错误,我已经在表单类上使用了
MyModel
,在我的UpdateView类上使用了
MyForm
。是的,您在表单类中使用MyModel的事实是正确的。但您正在表单类中创建新字段“choose”,它不引用模型类。因此,模板中显示的字段是自定义字段“选择”。这不是表单中的模型字段。