【问题标题】:How do I initiate values for fields in a form for editing in a template如何为表单中的字段启动值以在模板中进行编辑
【发布时间】:2012-05-25 10:29:55
【问题描述】:

我了解您可以将initiate 参数用于this question 中的Form 类。

我正在创建一个编辑表单,并试图弄清楚如何从预先存在的对象中启动值。

我是在模板级别还是在视图级别做(我什至不知道如何在模板级别做)?或者我可能需要将实际对象传递给表单并在表单级别启动?

最佳做法是什么?


编辑:

对于@Bento:在我原来的Form 中,我正在做这样的事情

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

我将如何使用ModelForm 做到这一点?

【问题讨论】:

    标签: python django django-forms django-templates django-views


    【解决方案1】:

    假设您使用的是 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 中添加字段。请查看我更新的问题。
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 2015-05-13
    • 2020-04-17
    • 1970-01-01
    • 2020-09-23
    • 2020-06-02
    • 2011-01-15
    • 2017-07-02
    相关资源
    最近更新 更多