Domanda

Sono abbastanza novizio per FormAlchemy e sembra che non capisco qualcosa. Ho un modello SQLAlchemy definita in questo modo:

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

Poi, nel mio controller (piloni) creo un modulo FormAlchemy in questo modo:

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 documentazione dice che "Per impostazione predefinita, sono tenuti colonne NOT NULL. È possibile aggiungere solo richiesta-ness, non rimuoverlo.", Ma voglio permettere non NULL stringhe vuote, che non consente validators.required. C'è qualcosa di simile blank=True, null=False in Django?

Per essere più precisi, voglio un validatore personalizzato come quella qui sotto, a uno consentire stringhe vuote con type=None o tutti i valori da impostare non NULL e non vuoto:

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

Se possibile, vorrei astenersi dal formalchemy.validators.required scimmia-patching o di altri kludges. Non voglio impostare nullable=True sui campi del modello, in quanto non sembra essere una soluzione adeguata anche.

Qual è il modo corretto per convalidare forma in questo caso? Grazie per eventuali suggerimenti in anticipo.

È stato utile?

Soluzione

Trovato Finalmente un (klugde, ma sembra che questo è l'unica scelta sensata) modo per fare questo.

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

(Per quanto riguarda il mio validatore) Nota, che FA completamente salta tutta la convalida quando il valore è None, perché, per convenzione, non passerà None a validatori (tranne che per validators.required, che è hard-coded). Ho presentato una richiesta di miglioramento biglietto cercando di risolvere questo: http: / /code.google.com/p/formalchemy/issues/detail?id=117

Altri suggerimenti

Può spiegare perché nullable=True non sarebbe la soluzione?

A me sembra inutile per memorizzare stringhe vuote nel database e non vorrei incoraggiarla. Se non ci sono dati che scegliere il tipo più efficiente per il database.

Personalmente penso che la soluzione di Django in caso di stringhe è sbagliato in quanto in realtà non supporta NULL in CharFields. Se si desidera memorizzare NULL in un CharField si dovrà farlo manualmente nel codice.

Questo è esattamente lo stesso problema che sto avendo, in cui io scrivo spesso interfacce per database esistenti e voglio usare formalchemy ma finiscono per dover rimuovere manualmente 'requiredness' come io non sono in grado di modificare il database.

Si può insegnare FormAlchemy di non sostituire un ingresso vuoto con nessuno, modificando l'attributo della colonna null_as.

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

Formalchemy sostituirà ingresso che è uguale al secondo membro della tupla null_as con None. (Il primo è il testo del display per selezionare e campi simili.)

Se si imposta che in una stringa l'utente non può in ingresso, questo non accadrà mai.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top