3

私はFormAlchemyの初心者で、何も得られないようです。私は次のように定義されたSQLAlchemyモデルを持っています:

...
class Device(meta.Base):
    __tablename__ = 'devices'

    id = sa.Column('id_device', sa.types.Integer, primary_key=True)
    serial_number = sa.Column('sn', sa.types.Unicode(length=20), nullable=False)
    mac = sa.Column('mac', sa.types.Unicode(length=12), nullable=False)
    ipv4 = sa.Column('ip', sa.types.Unicode(length=15), nullable=False)
    type_id = sa.Column('type_id', sa.types.Integer,
                        sa.schema.ForeignKey('device_types.id'))
    type = orm.relation(DeviceType, primaryjoin=type_id == DeviceType.id)
...

次に、(Pylons)コントローラーで、次のようなFormAlchemyフォームを作成します。

c.device = model.meta.Session.query(model.Device).get(device_id)
fs = FieldSet(c.device, data=request.POST or None)
fs.configure(options=[fs.ipv4.label(u'IP').readonly(),
                      fs.type.label(u'Type').with_null_as((u'—', '')),
                      fs.serial_number.label(u'S/N'),
                      fs.mac.label(u'MAC')])

ドキュメントには、「デフォルトでは、NOT NULL列が必要です。required-nessを追加することはできますが、削除することはできません。」と記載されていますが、NULL以外の空の文字列を許可したいので、許可しvalidators.requiredません。blank=True, null=FalseDjangoに何かありますか?

より正確には、以下のようなカスタムバリデーターを使用してtype=None、すべての値を含む空の文字列をNULLおよび空以外に設定できるようにします。

# For use on fs.mac and fs.serial_number.
# I haven't tested this code yet.
def required_when_type_is_set(value, field):
    type_is_set = field.parent.type.value is not None:
    if value is None or (type_is_set and value.strip() = ''):
        raise validators.ValidationError(u'Please enter a value')

formalchemy.validators.requiredできれば、モンキーパッチなどの応急修理は控えたいと思います。モデルフィールドを設定したくないnullable=Trueのは、それも適切な解決策ではないように思われるからです。

そのような場合にフォームを検証する正しい方法は何ですか?事前にご提案ありがとうございます。

4

4 に答える 4

4

ついに応急修理を見つけましたが、これが唯一の正しい方法のようです。

  fs.serial_number.validators.remove(formalchemy.validators.required)
  fs.mac.validators.remove(formalchemy.validators.required)

バリデーター関数の場合、値がである場合、そのFAはすべての検証を完全にスキップしますNone。これは、慣例により、バリデーターに渡さNoneれないためです(が設定されている場合を除き、validators.requiredハードコーディングされています)。これを解決するために、拡張リクエストチケットを提出しました。

于 2009-09-23T07:02:08.793 に答える
3

なぜnullable=True解決策にならないのか説明できますか?

私には、データベースに空の文字列を格納することは役に立たないように思われ、私はそれを奨励しません。データがない場合は、データベースに対してより効率的なタイプを選択してください。

個人的には、文字列の場合のDjangoソリューションは、CharFieldsでNULLを実際にはサポートしていないため、間違っていると思います。NULLをCharFieldに格納する場合は、コードで手動で格納する必要があります。

于 2009-09-22T21:22:02.223 に答える
0

これは私が抱えている問題とまったく同じです。既存のデータベースのインターフェイスを作成し、formalchemyを使用したいのですが、データベースを変更できないため、手動で「必須」を削除する必要があります。

于 2010-12-19T19:58:20.993 に答える
0

null_as列属性を変更することにより、FormAlchemyに空の入力をNoneに置き換えないように教えることができます。

 whatever = Column(Unicode(999), required=False, null_as=("","\0"), nullable=False, default="", doc="Whatever for ever")

null_asFormalchemyは、タプルの2番目のメンバーに等しい入力を。に置き換えますNone。(1つ目は、SELECTおよび同様のフィールドの表示テキストです。)

これをユーザーが入力できない文字列に設定すると、これは発生しません。

于 2014-05-31T11:25:01.380 に答える