답변:
POST 데이터를 전달하지 않기 때문에 수행하려는 작업은 양식에 표시 될 초기 값을 설정하는 것이라고 가정합니다. 이를 수행하는 방법은 initial
키워드를 사용하는 것입니다.
form = CustomForm(initial={'Email': GetEmailString()})
자세한 설명 은 Django Form 문서 를 참조하십시오 .
양식을 제출 한 후 값을 변경하려는 경우 다음과 같이 사용할 수 있습니다.
if form.is_valid():
form.cleaned_data['Email'] = GetEmailString()
사용에 대한 자세한 내용은 위의 참조 문서를 확인하십시오. cleaned_data
form.data['Email'] = GetEmailString()
하고 그것을 작동
form.fields['Email'].initial = GetEmailString()
The form.fields['keyword'].initial
는 양식을 인스턴스화 한 후에도 값을 초기화 할 수있는 액세스 권한을 제공합니다
이미 양식을 초기화 한 경우 필드의 초기 속성을 사용할 수 있습니다. 예를 들면
form = CustomForm()
form.fields["Email"].initial = GetEmailString()
__init__
어떤 이유로 폼의 메서드 내에서 수행 하려면 initial
dict를 조작 할 수 있습니다 .
class MyForm(forms.Form):
my_field = forms.CharField(max_length=255)
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.initial['my_field'] = 'Initial value'
수집 된 양식 데이터 세트의 사본 에 데이터를 추가하는 경우 Nigel Cohen과 같은 것이 작동합니다 .
form = FormType(request.POST)
if request.method == "POST":
formcopy = form(request.POST.copy())
formcopy.data['Email'] = GetEmailString()
data[form.add_prefix('Email')]
을 반드시 수행해야하는 경우 접두사가 설정된 경우를 고려해야합니다.
form.data = form.data.copy()
modelform_factory
. 이렇게하면 원하지 않는 필드가없는 Form 클래스를 생성 할 수 있습니다. 양식 개체가 렌더링되지 않은 필드에 대한 데이터를 계속 허용하므로 렌더링되지 않은 필드가있는 Form 클래스를 사용하는 것은 매우 위험합니다. 공격자는이를 유리하게 사용할 수 있습니다.
다음과 같이 양식을 초기화 한 경우
form = CustomForm()
2019 년 1 월 현재 올바른 방법 .initial
은 데이터를 대체하는 데 사용 하는 것입니다. 이것은 intial
양식과 함께 dict 의 데이터를 대체합니다 . 다음과 같은 일부 인스턴스를 사용하여 초기화 한 경우에도 작동합니다. form = CustomForm(instance=instance)
양식의 데이터를 바꾸려면 다음을 수행해야합니다.
form.initial['Email'] = GetEmailString()
이것을 일반화하면,
form.initial['field_name'] = new_value
Form.data 필드를 변경하십시오.
class ChooseProjectForm(forms.Form):
project = forms.ModelChoiceField(queryset=project_qs)
my_projects = forms.BooleanField()
def __init__(self, *args, **kwargs):
super(ChooseProjectForm, self).__init__(*args, **kwargs)
self.data = self.data.copy() # IMPORTANT, self.data is immutable
# any condition:
if self.data.get('my_projects'):
my_projects = self.fields['project'].queryset.filter(my=True)
self.fields['project'].queryset = my_projects
self.fields['project'].initial = my_projects.first().pk
self.fields['project'].empty_label = None # disable "-----"
self.data.update(project=my_projects.first().pk) # Update Form data
self.fields['project'].widget = forms.HiddenInput() # Hide if you want
믹스에 또 다른 방법을 던져 보자 : 이것도 좀 더 현대적인 표기법으로 작동한다. a QueryDict
가 불변 이라는 사실을 중심으로 작동합니다 .
>>> the_form.data = {**f.data.dict(), 'some_field': 47}
>>> the_form['some_field'].as_widget()
'<input type="hidden" name="some_field" value="47"
class="field-some_field" id="id_some_field">'
이를 수행하는 또 다른 방법은 이미 양식 (데이터 포함 또는 제외)을 초기화했으며 표시하기 전에 데이터를 추가해야하는 경우입니다.
form = Form(request.POST.form)
form.data['Email'] = GetEmailString()
ModelChoiceField
아직도 내가 그에게 줄 때 invalid_choice을주고있다initial
값 :(