将初始值传递给django formset中的ChoiceField

时间:2016-08-14 20:27:22

标签: django formset formsets

我无法弄清楚如何使用初始数据填充django ChoiceField。最好想在视图中进行,因为它会根据我传递给视图的参数而改变。

views.py

def index(request):
    init_ingredients = [{'food':'Candy','amt':12,'units':'cup'},{'food':'Bacon','amt':9,'units':'cup'}]
    IngredientsFormSet = formset_factory(IngredientLineForm, can_delete=True)
    if request.method == 'POST':
        formset = IngredientsFormSet(request.POST, request.FILES)
        ...
    else:
        formset = IngredientsFormSet(initial=init_ingredients)
&#39>食物'领域和' amt'字段填充,但'单位'字段 - 这是一个html选择输入不会填充初始值。我是否也需要定义选择?并且初始值是其中之一吗?

forms.py

class IngredientLineForm(forms.Form):
    food = forms.CharField(widget=forms.TextInput(attrs={'class':'foods form-control'})) #class = food
    units = forms.ChoiceField(widget=forms.Select(attrs={'class':'units form-control'}))
    amt = forms.CharField(widget=forms.NumberInput(attrs={'class':'amt form-control'}))

1 个答案:

答案 0 :(得分:0)

我使用:


    class netadminGlobalFormView(LoginRequiredMixin, FormView):
        model = netInfo
        form_class = netInfoForm

        def get_initial(self):
            initial = super(netadminGlobalFormView, self).get_initial()
            initial['eth0_ip'] = self.model_instance.get_eth0_ip_stdout
            initial['config_type'] = 'DHCP'
            return initial

请注意此处:


    initial['config_type'] = 'DHCP'

我从选择中设置了一个值:


    # value  displayed value
    config_types=(
       ('DHCP', 'Automatic (DHCP)'),
       ('MANUAL', 'Static (manual)')
    )

和表单定义包括以下内容:


    class netInfoForm(ModelForm):

        eth0_ip=forms.GenericIPAddressField(protocol='IPv4',
            widget=forms.TextInput(
            attrs={'placeholder': 'xxx.xxx.xxx.xxx'}),
            max_length=IPv4_addr_chars,
            label=IPv4_addr_html_label,
            help_text='required: i.e. 192.168.111.12 ',
            required=True
    #        ,error_messages={'required': 'Please enter IPv4 address, i.e. 192.168.111.12'}
        )

        config_type = forms.ChoiceField(choices=config_types, widget=forms.RadioSelect())
                                        #,initial='MANUAL')

和型号中:


    class netInfo(models.Model):
        eth0_ip     = models.CharField(max_length = IPv4_addr_chars, blank=True, null=False, default=get_eth0_ip_stdout)
        config_type = models.CharField(max_length=6, blank=False, null=False, default="DHCP")

在上述选择的示例中,不使用初始值'DHCP'或'MANUAL'进行选择。另外请注意,可以在表单类中设置初始名称(上面已注释)。

因此,正是您的问题:

1>我也需要定义选择吗?

是的,应该在模型中定义选择。

2>且初始值是其中之一吗?

是的,选择的初始值必须与您对形式和模型的选择定义相匹配。

至少在django 2.0中是如此。

关于问题1)-我不能断言没有其他方法可以初始化选择,但是对于我对问题2的示例回答来说,恰恰是-不匹配的值被忽略了(没有引发异常)。