首页 > 解决方案 > 如何用模型值填充表单字段

问题描述

我正在尝试用来自模型 Good 的数据填写我的表格。我使用按 id 过滤来获取某些对象。我需要重写 init 函数来设置一个有效的查询集,并且它可以工作。现在我需要为其他字段填充值。

这是我的forms.py:

class GoodGet(forms.ModelForm):
    class Meta:
        model = Good_Get
        Size = forms.ModelChoiceField(queryset = Good.objects.all())
        Name = forms.CharField(widget = forms.TextInput(attrs = {'value': Good.objects.all()}))
        fields = '__all__'

    def __init__(self, *args, good_id1=None, **kwargs):
        super(forms.ModelForm, self).__init__(*args, **kwargs)
        if good_id1 is not None:
            obj = Good.objects.filter(id = good_id1)
            for good in obj:
                good_sizes = good.Size.all()
            self.fields['Size'].queryset = good_sizes

我需要做这样的事情:

    def __init__(self, *args, good_id1=None, **kwargs):
        super(forms.ModelForm, self).__init__(*args, **kwargs)
        if good_id1 is not None:
            obj = Good.objects.filter(id = good_id1)
  --->      self.Name = obj.Name    <---
            for good in obj:
                good_sizes = good.Size.all()
            self.fields['Size'].queryset = good_sizes

那么,如何使用模型 Good 的数据填充其他字段的值?

标签: django

解决方案


您可以将初始值设置为:

def __init__(self, *args, good_id1=None, **kwargs):
    super(forms.ModelForm, self).__init__(*args, **kwargs)
    if good_id1 is not None:
        obj = Good.objects.get(id=good_id1)
        self.fields['Name'].initial = obj.Name
        self.fields['Size'].queryset = obj.Size.all()

因此,我们使用Good.objects.get(..)来检索Good与给定 id 匹配的对象,并将Name该对象的属性作为.initial该字段的值传递。

但是,如果只是ModelForm用对象的值初始化 a ,则可以使用instance=参数 [Django-doc],例如:

# construct a form with data from an instance
GoodGet(instance=Good.objects.get(id=some_id))

GoodGet话虽如此,你的表格中有一些奇怪的部分。添加Form后缀可能更好,您在类中指定字段,而不是在Meta类中,并且使用{ 'value': Good.object.all() }没有意义,因为值不能是一组Good对象。

class GoodGetForm(forms.ModelForm):
    Size = forms.ModelChoiceField(queryset=Good.objects.all())
    Name = forms.CharField(widget=forms.TextInput()}))
    class Meta:
        model = Good_Get
        fields = '__all__'

    # ...

推荐阅读