Pregunta

Soy bastante novato a FormAlchemy y parece que no consigo algo. Tengo un modelo SQLAlchemy define así:

...
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)
...

A continuación, en mi controlador (los pilones) creo una forma FormAlchemy como esto:

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')])

La documentación dice que "De manera predeterminada, se requieren columnas NOT NULL. Sólo puede agregar-dad requerida, lo elimina.", Pero quiero permitir que las cadenas vacías no NULL, que no permite validators.required. ¿Hay algo así como blank=True, null=False en Django?

Para ser más precisos, quiero un validador personalizado como se muestra a continuación, o bien permitir que las cadenas vacías con type=None o todos los valores de programación que no sea nula y no vacía:

# 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')

Si es posible, me gustaría que se abstengan de formalchemy.validators.required mono-parches u otros kludges. No quiero establecer nullable=True en campos del modelo, ya que no parece ser la solución correcta también.

¿Cuál es la forma correcta para validar la forma en tal caso? Gracias por cualquier sugerencia de antelación.

¿Fue útil?

Solución

Finalmente encontró un (klugde, pero parece que esta es la única opción sensata) manera de hacer esto.

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

(En cuanto a mi validador) Tenga en cuenta, que la FA completamente saltar toda la validación cuando el valor es None, ya que, por convención, no pasará a None validadores (a excepción de validators.required, que es hard-codificado). Yo he presentado un billete de solicitud de mejora tratando de resolver esto: http: / /code.google.com/p/formalchemy/issues/detail?id=117

Otros consejos

Puede explicar por qué nullable=True no sería la solución?

Me parece inútil para almacenar cadenas vacías en la base de datos y no me fomentarla. Si no hay datos que elegir el tipo más eficiente de la base de datos.

En lo personal creo que la solución de Django en el caso de las cadenas está mal, ya que en realidad no admite NULL en CharFields. Si desea almacenar NULL en una CharField que tendrá que hacerlo manualmente en el código.

Este es exactamente el mismo problema que estoy teniendo, donde a menudo escribo interfaces para bases de datos existentes y desea utilizar formalchemy, pero terminan por tener que quitar manualmente 'requiredness' ya que no soy capaz de cambiar la base de datos.

Se puede enseñar a FormAlchemy no reemplazar una entrada de vacío con Ninguno cambiando el atributo de columna null_as.

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

Formalchemy reemplazará de entrada que es igual al segundo miembro de la tupla null_as con None. (El primero es el texto de la pantalla para selecciona y campos similares.)

Si se establece que a una cadena que el usuario no puede de entrada, esto no sucederá.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top