2009-09-22 2 views
3

저는 FormAlchemy를 초보자로 생각하며 뭔가를 얻지 못하는 것 같습니다.FormAlchemy에서 NULL이 아닌 필드 (빈 문자열 허용)를 요구하지 마십시오

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

그런 다음 내 (철탑) 컨트롤러에서 나는이 같은 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')]) 

문서는 "기본적으로 NULL NOT 열이 있다고 나는 다음과 같이 정의 된 SQLAlchemy의 모델이 필수 항목 만 추가 할 수 있고 제거 할 수는 없습니다. "하지만 NULL이 아닌 빈 문자열을 허용하고 싶습니다. validators.required은 허용하지 않습니다. Django에 blank=True, null=False과 같은 것이 있습니까? 나는

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

가능한 경우 :

더 정확히 말하면, 나는 비어 있지 않은 비 NULL 및 설정 아래 하나, 같은 사용자 정의 유효성 검사기가 비어 type=None와 문자열이나 모든 값을 허용하거나 원하는 원숭이 패치 formalchemy.validators.required 또는 기타 kludges를 삼가고 싶습니다. 모델 필드에 nullable=True을 설정하고 싶지 않습니다. 적절한 해결 방법도 아닌 것 같습니다.

그런 경우 양식을 확인하는 올바른 방법은 무엇입니까? 미리 제안 해 주셔서 감사합니다.

답변

4

마침내 발견 된 (klugde,하지만 이것이 유일한 제정신 선택 인 것 같습니다) 방법. 값이 None 때 규칙에 의해, 그것은 validators.required을 제외하고 유효성 검사기 (에 None를 통과하지 않습니다, 때문에 FA가 완전히 하드 인 모든 유효성 검사를 건너 뛸 것이다, 주 (내 검증에 관한)

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

코딩 됨). http://code.google.com/p/formalchemy/issues/detail?id=117

3

nullable=True가 해결책이 될 수 없는지 설명 할 수 있습니까?

데이터베이스에 빈 문자열을 저장하는 것은 쓸모없는 것으로 보이고 권장하지 않습니다. 데이터가없는 경우 데이터베이스에 대해보다 효율적인 유형을 선택하십시오.

개인적으로 나는 CharFields에서 실제로 NULL을 지원하지 않기 때문에 Django 솔루션의 문자열이 잘못되었다고 생각합니다. CharField에 NULL을 저장하려면 코드에서 수동으로해야합니다.

+1

제안 해 주셔서 감사합니다. 아마도 맞을 수도 있습니다.이 문제에 대해 다른 의견이 있습니다. http://stackoverflow.com/questions/265875/default-string-initialization-null-or-empty. 어쨌든, 그 대답은 간단하고 그리 운 좋지는 않습니다 - 그것은 이미 기존 ("유산") 데이터베이스 지원입니다. 이미 그 DB를 사용하는 코드가 이미 많이 있으며, "값 없음"을위한 빈 문자열을 저장하고 NULL을 피하는 것이 관행입니다. – drdaeman

0

이것은 정확히 기존의 데이터베이스에 대한 인터페이스를 작성하고 formalchemy를 사용하지만 수동으로 제거해야하는 것과 동일한 문제입니다. 데이터베이스를 변경할 수 없기 때문에 '필요성'이 있습니다.

0

null_as 열 속성을 변경하여 빈 입력을 없음으로 바꾸지 않도록 FormAlchemy에 지시 할 수 있습니다.

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

Formalchemy는 Nonenull_as 튜플의 제 2 부재와 동일의 입력을 대체 할 것이다. 첫 번째 문자는 SELECT 및 유사한 필드의 표시 텍스트입니다.

사용자가 입력 할 수없는 문자열로 설정하면이 작업이 수행되지 않습니다.

관련 문제