Frage

Ich bin ziemlich neu für die Formalchemie und es scheint, dass ich nichts bekomme. Ich habe ein Sqlalchemy -Modell wie folgt:

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

Dann erstelle ich in meinem (Pylons) Controller eine Formalchemieform wie folgt:

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

In der Dokumentation heißt es, dass "standardmäßig keine Nullspalten erforderlich sind. Sie können nur die erforderliche Art hinzufügen, nicht entfernen." validators.required sich nicht übertrifft. Gibt es so etwas wie blank=True, null=False in Django?

Um genauer zu sein, möchte ich einen benutzerdefinierten Validator wie einen unten, um entweder leere Zeichenfolgen mit zuzulassen type=None oder alle Werte, die nicht null und nicht leer sind:

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

Wenn möglich, möchte ich das Affenpatching unterlassen formalchemy.validators.required oder andere Kludges. Ich möchte nicht einstellen nullable=True Auf Modellfeldern, weil es auch nicht eine richtige Lösung zu sein scheint.

Was ist der richtige Weg, um die Form in einem solchen Fall zu validieren? Vielen Dank für alle Vorschläge im Voraus.

War es hilfreich?

Lösung

Schließlich habe ein (Klugde, aber dies die einzige vernünftige Wahl) gefunden, um dies zu tun.

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

(In Bezug auf meinen Validator) Beachten Sie, dass FA wird vollständig Überspringen Sie die gesamte Validierung, wenn der Wert ist None, weil es durch Konvention nicht passieren wird None an Validatoren (außer auf validators.required, was hart codiert ist). Ich habe ein Ticket für Verbesserung eingereicht, um dies zu lösen: http://code.google.com/p/formalchemy/issues/detail?id=117

Andere Tipps

Kannst du erklären warum nullable=True Wäre nicht die Lösung?

Für mich scheint es nutzlos, leere Zeichenfolgen in der Datenbank zu speichern, und ich würde es nicht ermutigen. Wenn es keine Daten gibt, als den effizienteren Typ für die Datenbank zu wählen.

Persönlich denke ich, dass die Django -Lösung bei Saiten falsch ist, da sie Null in Charfeld nicht wirklich unterstützt. Wenn Sie Null in einem Charfield aufbewahren möchten, müssen Sie es manuell im Code tun.

Dies ist genau das gleiche Problem, das ich habe, wo ich oft Schnittstellen für vorhandene Datenbanken schreibe und die Formalchemie verwenden möchte, aber am Ende manuell "Erforderliche" entfernen muss, da ich die Datenbank nicht ändern kann.

Sie können Formalchemie beibringen, einen leeren Input nicht durch keine durch Ändern des null_as Spaltenattribut.

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

Die Formalchemie wird Eingaben ersetzen, die dem zweiten Mitglied der entspricht null_as Tupel mit None. (Der erste ist der Anzeigetext für Auswahl und ähnliche Felder.)

Wenn Sie dies auf eine Zeichenfolge festlegen, die der Benutzer nicht eingeben kann, wird dies niemals geschehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top