很抱歉,如果这是一个广泛的问题,但是我想了解设置初始值,以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方法来做到这一点?
答案 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',
)