Django表单-在__init __()方法中设置初始值的最佳实践

时间:2019-02-21 16:10:27

标签: python django

很抱歉,如果这是一个广泛的问题,但是我想了解设置初始值,以Django形式 init ()方法编辑字段(对Eg只读)的最佳实践方法。

以我的表格为例:

class ResultForm(forms.ModelForm):

    evidence = forms.CharField(
                widget=forms.Textarea(attrs={'rows': 3, 'cols': 60}),
                label='Evidence:',
                required=False,
            )

    def __init__(self, *args, **kwargs):
        super(ResultForm, self).__init__(*args, **kwargs)

        result_obj = self.instance
        if result_obj.tier_id:

            self.fields['evidence'].widget.attrs['readonly'] = True
            self.fields['evidence'].widget.attrs['class'] = 'classified' 

        else:
              ... do stuff ...

              self.initial['evidence'] = new_evidence_variable   



    class Meta:
        model = Result
        fields = (
                'id',
                'evidence',
                'tier_id',
            )

这很好呈现未绑定的表单,但是当我尝试使用POST数据验证它时, init 方法将在没有适当实例的情况下运行,并且会失败。

我的解决方法是,将我的代码放在try / except块的 init 中:

class ResultForm(forms.ModelForm):

    evidence = forms.CharField(
                widget=forms.Textarea(attrs={'rows': 3, 'cols': 60}),
                label='Evidence:',
                required=False,
            )

    def __init__(self, *args, **kwargs):
        super(ResultForm, self).__init__(*args, **kwargs)

        try:
            result_obj = self.instance
            if result_obj.tier_id:

                self.fields['evidence'].widget.attrs['readonly'] = True
                self.fields['evidence'].widget.attrs['class'] = 'classified' 

            else:
                  ... do stuff ...

                  self.initial['evidence'] = new_evidence_variable   

        except:
            pass


    class Meta:
        model = Result
        fields = (
                'id',
                'evidence',
                'tier_id',
            ) 

这似乎可行,但是似乎有些怪异。有没有“更好的”或更建议的django方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

是的,您是正确的。但是它需要进行以下调整才能更新

如果ResultForm类包含实例,则执行以下操作,否则进行检查

class ResultForm(forms.ModelForm):

    evidence = forms.CharField(
                widget=forms.Textarea(attrs={'rows': 3, 'cols': 60}),
                label='Evidence:',
                required=False,
            )

    def __init__(self, *args, **kwargs):
        super(ResultForm, self).__init__(*args, **kwargs)


        result_obj = self.instance
        if result.obj:   # Checks if result_obj is None or not

           self.fields['evidence'].widget.attrs['readonly'] = True
           self.fields['evidence'].widget.attrs['class'] = 'classified' 

        else:
           ... do stuff ...
           self.initial['evidence'] = new_evidence_variable   


    class Meta:
        model = Result
        fields = (
                'id',
                'evidence',
                'tier_id',
            )