2013-05-21 3 views
3

datetime.date,는 I가 SQLAlchemy에 사용하고 등 I 물 빌 전기 빌 같이 지폐를 나타내는 객체에 대한 침전물의 계면을 요리있어

와 WTForms 형태 개체 채우기 데이터를 처리하고, 폼을 처리하기 위해 wtform을 처리하고, 서비스를 제공하는 플라스크를 생성합니다. , wtforms를 사용

@app.route('/edit_bill/<int:bill_id>', methods = ['GET']) 
def edit_bill(bill_id): 
    s = Session() 
    bill = s.query(Bill).filter_by(id=bill_id).first() 
    form = BillForm(obj=Bill) 
    return render_template('edit_bill.html', form = form) 

, 내가 BillForm 생성자에 법안 객체를 전달하는 법안을 나타내는 데이터를 편집 할 것을 보장 :

는 여기에 기존 법안을 편집 형태를 제공처럼 내 경로가 어떻게 표시되는지를 보여줍니다 양식에 채워집니다.

여기가 질식하는 곳입니다. 여기에 예외는 다음과 같습니다

AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Bill.date_due has an attribute 'strftime' 

을 지금, 나는 파이썬 쉘에 담근 date_due가하는 것입니다 그것에 datetime.date 목적을 가지고 있는지 확인하기 위해 법안을 조회했습니다. Jinja를 사용하여 프런트 엔드를 구축 했으므로 템플릿 필터를 만드는 방법을 살펴 보았지만 wtform과 함께 작동하는 방법을 모르며 sqlalchemy가 질식하는 것처럼 보입니다.

그래서 어떻게됩니까? 나는 단지 그 문자열을 datetime.date 객체로 변환하는 방법을 알아야 할 필요가 있다고 확신하지만, 그것에 대해 어떻게 해야할지 잘 모르겠습니다.

하프. 감사!

편집 :

class BillForm(Form): 
    id     = HiddenField() 
    name    = TextField(u'Name:', [validators.required()]) 
    pay_to    = TextField(u'Pay To:',[validators.required()]) 
    date_due   = DateField(u'Date Due:',[validators.required()]) 
    amount_due   = IntegerField(u'Amount Due:', [validators.required()]) 
    date_late   = DateField(u'Late After:',[validators.required()]) 
    amount_late   = IntegerField(u'Late Amount:', [validators.required()]) 
    date_termination = DateField(u'Termination Date:',[validators.required()]) 

및 매핑 클래스, 너무 : 다음은 BillForm 클래스의

class Bill(Base): 
    __tablename__ = 'bills' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    pay_to = Column(String) 
    amount_due = Column(Integer) 
    date_due = Column(Date) 
    amount_late = Column(Integer) 
    date_late = Column(Date) 
    date_termination = Column(Date) 

    def __init__(self, name, pay_to, amount_due, date_due, amount_late, date_late, date_termination): 
     self.name    = name 
     self.pay_to    = pay_to 
     self.amount_due   = amount_due 
     self.date_due   = date_due 
     self.amount_late  = amount_late 
     self.date_late   = date_late 
     self.date_termination = date_termination 

    def __repr__(self): 
     return "<Bill ('%s', '%s', '%s', '%s')>" % (self.name, self.pay_to, self.amount_due, self.date_due) 
+0

양식 코드가 표시 될 수 있습니까? –

답변

4

아 당신이 잘못된 위치를 알아 내기 위해 좀 시간이 걸렸습니다,하지만 내가 찾은 것 같아. BillForm에서 obj kwarg으로 클래스를 전달하면

@app.route('/edit_bill/<int:bill_id>', methods = ['GET']) 
def edit_bill(bill_id): 
    s = Session() 
    bill = s.query(Bill).filter_by(id=bill_id).first() 
    form = BillForm(obj=Bill) 
    return render_template('edit_bill.html', form = form) 

지금, 형태가 이상한 모든 종류의 개체로 채워됩니다 : 여기에 코드입니다. 예를 들어 내가 한 것을 복제하고 form.date_due.data을 검사하면 <sqlalchemy.orm.attributes.InstrumentedAttribute at 0x277b2d0> 개체라고합니다. 오류 메시지에 표시된 것과 마찬가지로이 개체에는 strftime 특성이 없습니다.

그래서 오류는 제시 한 코드의 5 행에 있습니다. 4 행에서 가져온 계산서 오브젝트의 세부 사항으로 서식을 채우려면 5 행을 form = BillForm(obj=bill)으로 YY십시오. 보시다시피, '미묘한'차이점은 계산서의 소문자 b입니다. 귀하의 코드를 복제하고 문제를 해결해야한다고 확신합니다.

관심이 있으신 분은 일반적으로 편집보기를 만드는 방법입니다.

@app.route('/edit_bill/<int:bill_id>', methods = ['GET', 'POST']) 
def edit_bill(bill_id): 
    s = Session() 
    bill = s.query(Bill).filter_by(id=bill_id).first() 
    form = BillForm(request.form, obj=bill) 
    if request.method == 'POST' and form.validate(): 
     form.populate_obj(bill) 
     s.add(bill) 
     s.commit() 
     # Do some other stuff, for example set a flash() 
    return render_template('edit_bill.html', form = form) 

저는 잠시 동안 SQLAlchemy를 사용하지 않았기 때문에 몇 가지 실수를 저지를 수 있습니다. 희망이 도움이! 이 질문에 대한 대답이 '대답'인 경우

+0

오, 세상에, 나는 지금 내 머리 속에 비명을 지르고있다. 너는 클래스가 아닌 인스턴스를 전달해야한다! oi vey. 나는 당신의 편집 경로를 더 좋아한다.레일에서 그 패턴을 보았습니다 (POST가 데이터를 폼에서 유지하는 경우 GET이 데이터를 제공하는 경우). 그리고 나는 그것을 완전히 사용할 것입니다. 감사합니다. – nothankyou