문제

나는 Modelform의 인라인 메타 클래스를 내 견해에서 동적으로 업데이트하기를 희망합니다. 이 코드는 메타 클래스에서 제외 목록을 업데이트하는 것처럼 보이지만 출력은 as_p(), as_ul(), 등은 업데이트 된 메타 제외를 반영하지 않습니다.

그런 다음 Modelform이 생성 될 때 HTML이 생성된다고 가정합니다. as_*() 호출됩니다. HTML의 업데이트를 강요하는 방법이 있습니까?

이것이 가장 좋은 방법입니까? 방금 이것을 가정했습니다 ~해야 한다 일하다.

생각?

from django.forms import ModelForm

from testprogram.online_bookings.models import Passenger

class PassengerInfoForm(ModelForm):

    def set_form_excludes(self, exclude_list):
        self.Meta.exclude = excludes_list

    class Meta:
        model = Passenger
        exclude = []
도움이 되었습니까?

해결책

메타 클래스는 양식 정의를 동적으로 구성하는 데 사용됩니다. 따라서 modelform 인스턴스를 생성 할 때까지 제외되지 않은 필드는 이미 새로운 객체의 속성으로 추가되었습니다.

정상적인 방법은 가능한 각각의 제외 목록에 대해 여러 클래스 정의를 갖는 것입니다. 그러나 양식 자체가 역동적이 되려면 즉시 클래스 정의를 만들어야합니다. 같은 것 :

def get_form(exclude_list):
    class MyForm(ModelForm):
        class Meta:
            model = Passenger
            exclude = exclude_list
    return MyForm

form_class = get_form(('field1', 'field2'))
form = form_class()

업데이트: 방금이 게시물을 다시 방문했고 동적 클래스를 처리하기 위해 조금 더 관용적 인 방법을 게시 할 것이라고 생각했습니다.

def PassengerForm(exclude_list, *args, **kwargs):
    class MyPassengerForm(ModelForm):
        class Meta:
            model = Passenger
            exclude = exclude_list

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

    return MyPassengerForm()

form = PassengerForm(('field1', 'field2'))

다른 팁

또 다른 방법:

class PassengerInfoForm(ModelForm):
    def __init__(self, *args, **kwargs):
        exclude_list=kwargs.pop('exclude_list', '')

        super(PassengerInfoForm, self).__init__(*args, **kwargs)

        for field in exclude_list:
            del self.fields[field]

    class Meta:
        model = Passenger

form = PassengerInfoForm(exclude_list=['field1', 'field2'])

유사한 접근법, 다소 다른 목표 (임의 모델의 일반적인 modelform) :

from django.contrib.admin.widgets import AdminDateWidget
from django.forms import ModelForm
from django.db import models

def ModelFormFactory(some_model, *args, **kwargs):
    """
    Create a ModelForm for some_model
    """
    widdict = {}
    # set some widgets for special fields
    for field in some_model._meta.local_fields:
        if type(field) is models.DateField:
            widdict[field.name] = AdminDateWidget()

    class MyModelForm(ModelForm): # I use my personal BaseModelForm as parent
        class Meta:
            model = some_model
            widgets = widdict

    return MyModelForm(*args, **kwargs)

사용 modelform_factory (문서):

from django.forms.models import modelform_factory

from testprogram.online_bookings.models import Passenger

exclude = ('field1', 'field2')
CustomForm = modelform_factory(model=Passenger, exclude=exclude)  # generates ModelForm dynamically
custom_form = CustomForm(data=request.POST, ...)  # form instance
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top