programing

Django (비 모델) 양식 미리 채우기

goodcopy 2021. 1. 17. 11:54
반응형

Django (비 모델) 양식 미리 채우기


일부 정보를 기반으로 장고 양식의 데이터를 미리 채우려 고하지만 ModelForm을 사용하지 않기 때문에 인스턴스를 설정할 수 없습니다.

이것은 정말 쉬울 것 같지만 어떤 이유로이 작업을 수행하는 방법을 알려주는 문서를 찾을 수 없습니다. 이것은 내 양식입니다.

class MyForm(forms.Form):
  charfield1 = forms.CharField(max_length=3)
  charfield2 = forms.CharField(max_length=3)
  choicefield = forms.ModelChoiceField(MyModel.objects.all())

나는 단지 시도했다.

form = MyForm()
form.charfield1 = "foo"
form.charfield2 = "bar"
# a model choice field
form.choicefield = MyModel.objects.get(id=3)

작동하지 않습니다.


시험:

form = MyForm({'charfield1': 'foo', 'charfield2': 'bar'})

Form객체 생성자는 필드 값의 사전을 취할 수 있습니다. 이렇게하면 데이터의 유효성을 검사하고 데이터가 표시된 HTML로 양식을 렌더링하는 데 사용할 수있는 바인딩 된 양식이 생성됩니다. 자세한 내용 은 양식 API 문서를 참조하세요.

편집하다:

완전성을 위해 양식을 바인딩하지 않고 일부 필드에 대한 초기 값을 선언하려는 경우 대신 다음을 사용할 수 있습니다.

form = MyForm(initial={'charfield1': 'foo', 'charfield2': 'bar'})

자세한 내용은 초기 값 문서를 참조 하십시오.


Django 양식을 채우는 방법에는 두 가지가 있습니다.

첫 번째는 사전을 인스턴스화 할 때 첫 번째 인수로 전달하는 것입니다 (또는 data동일한 kwarg 로 전달 ). 이는 POST 데이터를 사용하여 양식을 채우고 유효성을 검사하려는 경우 수행하는 작업입니다.

data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3}
form = MyForm(data_dict)

그러나 이렇게하면 양식에 대한 유효성 검사 가 트리거 되므로 처음부터 유효하고 완전한 데이터를 실제로 전달하는 경우에만 작동합니다. 그렇지 않으면 오류로 시작됩니다.

양식을 채우는 다른 방법은 initial매개 변수 를 사용하는 것입니다 ( 여기에 문서화 됨 ). 이는 양식 필드에 대한 초기 값을 제공하지만 유효성 검증을 트리거 하지 않습니다 . 따라서 예를 들어 모든 값을 채우지 않는 경우에 적합합니다.

form = MyForm(initial=data_dict)

를 통해 선택 필드를 채우려면 initialpk 값을 사용하십시오.


model_to_dict ()를 사용하여 인스턴스를 사전으로 변환 한 다음이를 양식에 채울 수 있습니다. 다음과 같이 작동합니다.

from django.forms.models import model_to_dict
...
my_obj = MyModel.objects.get(abc=123)
form = MyForm(initial=model_to_dict(my_obj))

참고 : 저는 django 버전 1.3을 사용하고 있습니다.


그만한 가치가있는 경우이를 수행하는 FormView클래스 기반보기 방법은 FormViewget_initial함수 를 재정의하는 것 입니다. 에서 양식을 인스턴스화하는 get_initial데 사용하는 초기 키워드 인수를 반환합니다 get_form_kwargs.

문서 :

샘플 코드 :

from django.views.generic.edit import FormView

class MyFormView(FormView):

    def get_initial(self):
        initial = super(MyFormView, self).get_initial()
        # update initial field defaults with custom set default values:
        initial.update({'charfield1': 'foo', 'charfield2': 'bar'})
        return initial

참조 URL : https://stackoverflow.com/questions/936376/prepopulate-django-non-model-form

반응형