2

n no を含む models.py を含むアプリケーションが 1 つあります。基本クラスを継承するクラスの。ユーザーnから動的に値を取得するフォームを作成したいデータベースに保存しますが、問題はdjangoモデルフォームの代わりにdjangoフォームフィールドを使用することです。

私たちが知っているように、PositiveIntegerField、CommaSeparetedIntegerFieldsなどの Django フォームにはいくつかのフィールドがありません。Django フォーム フィールドを使用してこれをどのように達成できますか?
シェルで次のコードを記述した場合。

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

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

フォーム.py

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'}
4

1 に答える 1

1

ソースを見ると、フィールドが行うことは、キーワード引数を使用してデフォルトのフォーム フィールドを呼び出すことだけですmin_value

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のように見えます。CharFielddjango.core.validators.validate_comma_separated_integer_list

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

これは、渡された文字列が であることを確認するだけです'^[\d,]+$'。フィールドはpython変換さえしません...フォーム入力を検証するだけでは、実際には多くの時間を節約するようには見えません。確かに、「contrib に移動するかもしれない」というコメントがあります。同意した..


楽しみのためにこれを調べることにしました。モデルフィールドを新しいフィールドでオーバーライドするModelFormジェネレーターを次に示します...まだkwargsを処理していません。これは、モデルフォームの生成自体を調べずに、これを行うために考えられた最初の方法でした。ModelForm/after/初期化のフォームを変更するレギュラーを構築します。

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
于 2012-05-04T07:07:34.803 に答える