2012-05-04 2 views
2

n 개의 no를 포함하는 models.py를 포함하는 하나의 애플리케이션이 있습니다. 기본 클래스를 상속받은 클래스의 클래스를 생성합니다. 우리는 db에 저장되는 사용자 n에서 동적으로 가치있는 양식을 만들고 싶지만 문제는 django 모델 양식 대신 django 양식 필드를 사용하려는 것입니다.Django에서 양식 필드로 모델 필드를 매핑하는 방법

우리가 장고 형태에서 누락 일부 필드는 우리가 사용하는 장고 양식 필드를 달성 할 수있는 방법 등 PositiveIntegerField, CommaSeparetedIntegerFields로가 알다시피?
쉘에 다음 코드를 쓰면. min_value을 :

from djnago.db import models 
mvar = models.PositiveIntegerFields() 

from django import forms 
fvar = forms.PositiveIntegerFields() 
AttributeError: 'module' object has no attribute 'PositiveIntegerField' 

from django import forms 

class ContextForm(forms.Form): 
    def __init__(self, rdict, *args, **kwargs): 
     super(ContextForm, self).__init__(*args, **kwargs) 
     for key in rdict.keys(): 
      self.fields['%s' % str(key)] = getattr(forms,rdict.get(key))() 

rdict = {'address': 'CharField','phone': 'CharField', 'Salary': 'PositiveIntegerField','first name': 'CharField','last name':'CharField'} 
+0

왜 'ModelForm'을 사용하지 않고 standart Form을 사용하겠습니까? 'ModelForm'으로 여러분이 원하는 것은 이미 여러분에게 주어지기 때문에, 그것을 사용하지 않는 정말로 좋은 이유가 있어야합니다. – FallenAngel

+0

우리는 ModelForm을 동적으로 생성 할 수 있습니까 ??? –

+0

나는 우리가 할 수있는 것이라고 확신한다 – okm

답변

2

forms.py 모든 필드는 키워드 인수를 사용하여 기본 양식 필드를 호출입니다 않는 소스를 찾고 있습니다.

class PositiveIntegerField(IntegerField): 
    description = _("Positive integer") 

    def get_internal_type(self): 
     return "PositiveIntegerField" 

    def formfield(self, **kwargs): 
     defaults = {'min_value': 0} 
     defaults.update(kwargs) 
     return super(PositiveIntegerField, self).formfield(**defaults) 

따라서 당신이 찾고있는 것은 단지

from django import forms 
fvar = forms.IntegerField(min_value=0) 
fvar.clean(-1) 
# ValidationError: [u'Ensure this value is greater than or equal to 0.'] 

CommaSeparatedIntegerField에 관해서는, 그것은 전달 일부 django.core.validators.validate_comma_separated_integer_listCharField 것 같습니다.

f = forms.CharField(validators=[django.core.validators.validate_comma_separated_integer_list]) 
f.clean('1,2,3') 

을이 모든 수행은 확인입니다 전달 된 문자열은 '^[\d,]+$'입니다. 이 필드는 파이썬 변환조차하지 않습니다 ... 폼 입력의 유효성을 검사 할 때 많은 시간을 절약하는 것처럼 보이지 않습니다. 실제로 "아마도 기여로 옮겨라"는 의견이 있습니다. 동의 함.


재미로 살펴보기로 결심했다. 새 필드로 모델 필드를 재정의하는 ModelForm 생성기가 있습니다 ... 아직 kwargs를 처리하지 않습니다. 그것은 모델 폼 생성 그 자체를 들여다 보지 않고서 제가 이것을 할 수있는 첫 번째 방법이었습니다. 이것은/0120 다음의 형식을 수정하는 일반 ModelForm을 구성합니다.

MODEL_FIELD_MAP = { 
    models.IntegerField: forms.CharField, 
    # change all IntegerField to forms.CharField 
} 

def modelform_generator(mymodel): 
    class MyModelForm(forms.ModelForm): 
     class Meta: 
      model = mymodel 
     def __init__(self, *args, **kwargs): 
      super(MyModelForm, self).__init__(*args, **kwargs) 
      for name, form_field in self.fields.items(): 
       try: 
        model_field = self._meta.model._meta.get_field_by_name(name)[0] 
        # is this a model field? 

        field_override = MODEL_FIELD_MAP.get(model_field.__class__) 
        # do we have this model field mapped to a form field? 

        if field_override: 
         self.fields[name] = field_override() 
         # set the form field to the target field class 

       except models.FieldDoesNotExist: 
        pass 
    return MyModelForm 
+0

대신이 솔루션 대신 모델 필드를 폼 필드에 매핑하는 방법이 있습니다. 장고 양식에없는 나머지 분야는 어떨까요? 또한 모델 필드와 매핑해야하는 동적 양식을 작성 중입니다. –

+3

@SweetGirl은 ModelForms의 용도와 정확히 일치하지 않습니까? –

+0

우리는 modelform을 동적으로 생성 할 수 있습니까? –

관련 문제