Python 如何为表单中的字段初始化值,以便在模板中进行编辑

Python 如何为表单中的字段初始化值,以便在模板中进行编辑,python,django,django-forms,django-templates,django-views,Python,Django,Django Forms,Django Templates,Django Views,我知道您可以从中使用initiate参数作为表单类 我正在创建一个编辑表单,并试图找出如何从预先存在的对象初始化值 我是在模板级还是在视图级(我甚至不知道如何在模板级)执行此操作?或者我需要将实际对象传递给表单并在表单级别启动 最佳做法是什么 编辑: 对于@Bento:在我最初的表单中,我正在做类似的事情 class OrderDetailForm(forms.Form): work_type = forms.ChoiceField(choices=Order.WORK_TYPE_CH

我知道您可以从中使用
initiate
参数作为
表单

我正在创建一个编辑表单,并试图找出如何从预先存在的对象初始化值

我是在模板级还是在视图级(我甚至不知道如何在模板级)执行此操作?或者我需要将实际对象传递给表单并在表单级别启动

最佳做法是什么


编辑:

对于@Bento:在我最初的
表单中
,我正在做类似的事情

class OrderDetailForm(forms.Form):
    work_type = forms.ChoiceField(choices=Order.WORK_TYPE_CHOICES)
    note = forms.CharField(widget=forms.Textarea)

    def __init__(self, creator_list=None, place_list=None, *args, **kwargs):
        super(OrderCreateForm, self).__init__(*args, **kwargs)

        if creator_list:
            self.fields['creator'] = UserModelChoiceField(
                queryset=creator_list,
                empty_label="Select a user",
            )

    def clean(self):
        super(OrderCreateForm, self).clean()

        if 'note' in self.cleaned_data:
            if len(self.cleaned_data['note']) < 50:
                self._errors['note'] = self.error_class([u"Please enter a longer note."])

                del self.cleaned_data['note']

        return self.cleaned_data
类OrderDetailForm(forms.Form):
工作类型=表单.ChoiceField(选项=订单.work类型\u选项)
note=forms.CharField(widget=forms.Textarea)
定义初始化(self,creator\u list=None,place\u list=None,*args,**kwargs):
超级(OrderCreateForm,self)。\uuuuuuuuuuuuuu初始化(*args,**kwargs)
如果创建人列表:
self.fields['creator']=UserModelChoiceField(
queryset=创建者列表,
清空\u label=“选择一个用户”,
)
def清洁(自清洁):
super(OrderCreateForm,self).clean()
如果self.u数据中有“note”:
如果len(自清洁_数据['note'])小于50:
self.\u errors['note']=self.error\u类([u“请输入更长的注释。”]))
del self.cleaned_数据['note']
返回自清理的_数据

如何使用
ModelForm

假设您使用的是ModelForm,它实际上相当简单。任务是这样的:检索要填充“编辑”的模型对象,基于模型表单创建新表单,并使用“实例”填充对象

以下是您的视图框架:

def view(request): 
  obj = Model.objects.get(pk = objectpk)
  form = MyModelForm(instance = obj)

  return render (request, "template", {'form' = form})
您可以通过以下方式访问“初始”值:

form.fields['fieldname'].initial = somevalue

然后你会像上面那样返回表单

我使用的是
forms.Form
,而不是
forms.ModelForm
,但我可以将我的表单模型转换为
ModelForm
。我没有使用
ModelForm
的原因是,我的表单有一个基于权限的系统,它可以动态地为某些用户创建字段。使用常规表单可能可以实现同样的效果,但您可能需要手动填充数据——即检索查询集,并使用上面的.initial方法将数据解析为各个字段。如果你明白了,发布你的解决方案。好的,是的,我将把我的表单转换成
ModelForm
。我需要弄清楚如何以编程方式在
ModelForm
中添加字段。请看我更新的问题。