2013-07-02 2 views
0

그래서 사용자가 양식의 이전 데이터를 편집 할 수있는 편집 단추를 사용하여 WTForms에서 양식을 만들었습니다.WTForms 다시 채우는 방법

나는 내가 다음으로 Request.Form을 얻을 않는 form.when에서 새 데이터를 가져 오는되어있는 문제 :

ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')]) 

내가 원하는 것은이 위의 출력에서 ​​다음을 검색을

('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')]) 

답변

0

목록 이해를 사용하여 csrf_tokens를 필터링 할 수 있습니다.

>>> import werkzeug 
>>> i = werkzeug.ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')]) 
>>> i 
ImmutableMultiDict([('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('csrf_token', u'20130702225444##3f1c28cecaf55dc0e441d9820dfb52bb6df3d200'), ('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')]) 
>>> keys = ['location_name', 'feed_url', 'title', 'url', 'date_crawled', 'content_url', 'longitude', 'latitude', 'date_added', 'types'] 
>>> data = [(key, i[key]) for key in i if key in keys] 
>>> data 
[('location_name', u'b'), ('feed_url', u'bkj'), ('title', u'b'), ('url', u'b'), ('date_crawled', u'b'), ('content_url', u'b'), ('longitude', u'b'), ('latitude', u'b'), ('date_added', u'b'), ('types', u'b')] 
>>> 
1

당신은 이미 WTForms에서 폼 클래스를 작성하는 일을했다 (그리고 난 당신이 목적에 CSRF를 사용하지 않는 crsf_token가 정상적으로 없을 것이라는 점을 주어, 플라스크-WTF 의심).

class MyForm(Form): 
    feed_url = TextField(...) 
    # etc 

다음 당신은 이미 이제이 멋진 폼 객체를 가지고, 그것을 사용

def my_view(): 
    form = MyForm(request.form) 
    render('mytemplate.html', form=form) 

같은 것을했다 :

은 그래서 당신이 이미 유사한 짓을 의미합니다! 즉 데이터 형식의 강제 데이터가 포함 된 form.data 또는 form.feed_url.data의 데이터에 액세스하십시오. 또한 wtforms의 유효성 검사 논리를 사용하여 잘못된 데이터가 없는지 확인할 수 있습니다. 프레임 워크에서 가져 오는 원시 입력 인 request.form을 사용할 이유가 없습니다.

이 (이, 당신은 당신의 프레임 워크에 대한 적절한 호출 이름을 얻을 필요가 가상의 의사 프레임 워크에 대한 일반적인 예입니다주의) 같은 당신을 착륙합니다 :

def edit_location(location_id): 
    my_object = LocationInfo.get(location_id) 
    form = MyForm(request.form, obj=my_object) 
    if request.form and form.validate(): 
     # If we got here, we have POST data and the form validated. 
     form.populate_obj(my_object) # Super cool magic! 
     my_object.save() 
     return redirect(...) 

    # If we fall back to here, it means validation failed or we're 
    # viewing the form for the first time. 
    render('mytemplate.html', form=form) 

을 내가 읽고 추천 Crash Course에 대한 WTForms 및 WTForms 사용하는 방법에 대한 더 나은 아이디어를 위해 거기에 다른 문서 중 일부.