문제

Flask, WTForms (및 Flask-WTF)를 익히고 있습니다.나는 내가 뭔가를 놓치고있는 것처럼 느낀다.

WTForms 문서 "양식 필드 HTML이 될 수 있습니다.생성하지만 템플릿에서 사용자 정의 할 수 있지만 코드 및 프리젠 테이션의 분리를 유지하고 Python 코드에서 지저분한 매개 변수를 유지할 수 있습니다. "

HTML 라디오 입력을 모델링하는 제안 된 방법은 다음과 같습니다.

class ExmapleForm(Form):
    language = RadioField(u'Programming Language', choices=[('py', 'Python'), ('js', 'JavaScript')])
.

.... 템플리트 HTML 라디오 입력을 템플릿으로하는 방법은 다음과 같습니다.

{% for subfield in form.radio %}
    <tr>
        <td>{{ subfield }}</td>
        <td>{{ subfield.label }}</td>
    </tr>
{% endfor %}
.

이 접근 방식은 선택 속성이 "모델과 프리젠 테이션을 혼합하는 시퀀스"

는 레이블을 템플릿으로 이동하고 값과 일치하는 방법입니다.

도움이 되었습니까?

해결책

흥미로운 질문. 우리가 MVC 패턴의 관점에서 생각하면 드롭 다운에있는 선택 목록 목록이 모델에 속하지 않고보기가 아닙니다. 그래서 나는이 템플릿에서 디자이너가 정의한이 선택을하지 않을 것입니다. 나는 우리가 이것에 동의한다고 믿는다.

귀하의 예에서와 같이 형태로 하드 코딩 된 선택 목록이 더 좋지만 이상적이지 않습니다. 아마도 Language 모델이나 유사한 엔티티가 올바른가요? 해당 모델은 유효한 프로그래밍 언어 선택에 대한 권한이므로 다른 사람에게 유효한 선택 목록을 제공하는 것이 아닙니다.

귀하의 질문에 언급 할 때 각 선택 사항은 내부 이름과 표시 이름이 있습니다. 그리고 디스플레이 문자열에 대해 이야기하고 있기 때문에 필드의 u'Programming Language' 제목이 동일한 카테고리 문자열 범주에 떨어지는 것을 잊지 마십시오. 이 문자열은 템플릿 디자이너의 책임이어야합니까? 나는 모르겠지만, 이것은 모델과 프레젠테이션 사이의 회색 영역이며, 디자이너가 상황이 어떻게 보이지만 내용이 아닌지에 대한 권한을 가져야한다고 생각합니다.

이러한 디스플레이 문자열이 어떻게 보이는지 더 많은 제어를 원한다면 getText (flask-babel을 통해)와 같은 번역 툴킷을 사용할 수 있습니다. 응용 프로그램이 GetText를 통해 텍스트를 렌더링하는 경우 코드 나 템플리트의 문자열을 다른 문자열로 매핑 할 수 있습니다. 이는 다른 언어로 번역하는 데 사용되지만 응용 프로그램의 모국어로 문자열이 표시되는 방식에 대해 별도의 컨트롤을 사용할 수도 있습니다. 맵핑은 외부 데이터 파일에서 수행되므로 이것은 당신이 찾고있는 독립성을 달성한다고 생각합니다.

다른 팁

순수한 이론적 인 관론의 관점에서 좋은 생각으로 보이지 않는 것처럼 보입니다.템플리트의 실제 값으로 레이블을 연결 해야하는 경우 이것은 템플릿에 비즈니스 로직이있는 것을 의미합니다.

더 많은 코드를 어떻게 구현 하시겠습니까?레이블을 할당하는 명령문 내에서 하위 필드 컨텍스트가 필요합니다.그 코드가 템플릿에서 잘 보이는 것을 상상할 수 없습니다.그리고 그것이해야 할 때 프레젠테이션 논리의 일부가 될 것입니까?

여기에 내가 일어난 솔루션이 있습니다 (분리 유지).그것은 과도하게 될지 모르지만 나는 그것을 시도하고 그것이 비늘적인지를 보게 될 것입니다.

forms.py :

import sys
sys.path.append("templates")
import constants

class ExmapleForm(Form):
    language = RadioField('language', choices=constants.languages['choices'], validators=constants.languages['validators'])
.

그런 다음 Constants.py라는 템플릿 폴더에 파일을 만들었습니다.

from wtforms.validators import InputRequired

languages = {
    'choices': [
        ('py', 'Python'),
        ('js', 'JavaScript')
    ],
    'validators': [
        InputRequired(message = 'Please Select')
    ]
}
.

도움이되기를 바랍니다 (및 작동)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top