2016-11-30 3 views
0

Привет, я создал новую форму проекта, которую пользователь может отправить, которая отправляется на мой адрес электронной почты. В настоящее время интересно узнать, как получить только входные метки логических полей, выбранных пользователем (= True), отправленных на мой адрес электронной почты, а не все из них. Будет ли это включать цикл for для wtype1-5: if True, submit. else: no submit? Например, использование: form.wtype1.data для необязательных логических полей возвращает True или False. Я хочу только метки входов True. Использование form.wtype1.label возвращает уродливую строку с тегами меток HTML, поэтому мне пришлось прибегнуть к form.wtype1.description, что не является решением, потому что я получаю все значения не только True.необходимо выбрать радио/логические поля ввода, отправленные на адрес электронной почты - wtforms + flask

тестовое письмо

От: Ричард салат [email protected]

Статические Блог электронной коммерции Форум Другие

Basic

Basic Template 7

Это комментарий область базовая тестовая форма для функциональных возможностей ввода

класс формы и функции

class NewProjectForm(Form): 
    subject = 'New Project Request!' 
    name = TextField([validators.Length(min=5, max=20)]) 
    email = TextField([validators.Length(min=8, max=50), validators.Email()]) 
    wtype1 = BooleanField(validators=[validators.Optional()], label='Static', description='Static') 
    wtype2 = BooleanField(validators=[validators.Optional()], label='Blog', description='Blog') 
    wtype3 = BooleanField(validators=[validators.Optional()], label='Ecommerce', description='Ecommerce') 
    wtype4 = BooleanField(validators=[validators.Optional()], label='Forums', description='Forums') 
    wtype5 = BooleanField(validators=[validators.Optional()], label='Other', description='Other') 
    wtype = (wtype1,wtype2,wtype3,wtype4,wtype5) 

    wpack = RadioField([validators.Required()], choices=[('SkyFly','SkyFly'),('Basic','Basic'),('Standard','Standard'),('Intermediate','Intermediate')]) 
    templates = RadioField([validators.Required()], choices=[('Basic Template 1','Basic Template 1'),('Basic Template 2','Basic Template 2'), \ 
          ('Basic Template 3','Basic Template 3'), ('Basic Template 4','Basic Template 4'),('Basic Template 5','Basic Template 5'), \ 
          ('Basic Template 6','Basic Template 6'),('Basic Template 7','Basic Template 7'),('Basic Template 8','Basic Template 8'), \ 
                ('Basic Template 9','Basic Template 9'),('Basic Template 10','Basic Template 10'), \ 
               ('Intermd. Template 1', 'Intermd. Template 1'),('Intermd. Template 2','Intermd. Template 2')]) 
    comments = TextAreaField([validators.Length(min=10, max=400)]) 

@app.route('/dashboard/newproject/', methods=["GET","POST"]) 
def new_project(): 
    try: 
     form = NewProjectForm() 

     if request.method == "POST": 
      if form.validate() == False: 
       flash('Invalid! All fields are required.') 
       return render_template("dashboardNewproject.html", form=form) 

      else: 
       msg = Message(form.subject, sender='form.email.data', recipients=['[email protected]']) 
       msg.body = """ 
       From: %s %s \n 
       %s %s %s %s %s \n %s \n %s \n \n %s 
       """ % (form.name.data, form.email.data, form.wtype1.description, form.wtype2.description, \ 
         form.wtype3.description, form.wtype4.description, form.wtype5.description, \ 
         form.wpack.data, form.templates.data, form.comments.data) 
       mail.send(msg) 

       flash('Congratulations! A new project has been submitted.') 
       gc.collect() 

ответ

1

Чтобы изменить наименьшее количество кода, но сделать это делать то, что вы хотите, чтобы это сделать, я хотел бы сделать:

class NewProjectForm(Form): 
    subject = 'New Project Request!' 
    name = TextField([validators.Length(min=5, max=20)]) 
    email = TextField([validators.Length(min=8, max=50), validators.Email()]) 
    wtype1 = BooleanField(validators=[validators.Optional()], label='Static', description='Static') 
    wtype2 = BooleanField(validators=[validators.Optional()], label='Blog', description='Blog') 
    wtype3 = BooleanField(validators=[validators.Optional()], label='Ecommerce', description='Ecommerce') 
    wtype4 = BooleanField(validators=[validators.Optional()], label='Forums', description='Forums') 
    wtype5 = BooleanField(validators=[validators.Optional()], label='Other', description='Other') 
    wtype = (wtype1,wtype2,wtype3,wtype4,wtype5) 

    wpack = RadioField([validators.Required()], choices=[('SkyFly','SkyFly'),('Basic','Basic'),('Standard','Standard'),('Intermediate','Intermediate')]) 
    templates = RadioField([validators.Required()], choices=[('Basic Template 1','Basic Template 1'),('Basic Template 2','Basic Template 2'), \ 
          ('Basic Template 3','Basic Template 3'), ('Basic Template 4','Basic Template 4'),('Basic Template 5','Basic Template 5'), \ 
          ('Basic Template 6','Basic Template 6'),('Basic Template 7','Basic Template 7'),('Basic Template 8','Basic Template 8'), \ 
                ('Basic Template 9','Basic Template 9'),('Basic Template 10','Basic Template 10'), \ 
               ('Intermd. Template 1', 'Intermd. Template 1'),('Intermd. Template 2','Intermd. Template 2')]) 
    comments = TextAreaField([validators.Length(min=10, max=400)]) 

    def wtype(self): 
     return (self.wtype1,self.wtype2,self.wtype3,self.wtype4,self.wtype5) 

@app.route('/dashboard/newproject/', methods=["GET","POST"]) 
def new_project(): 
    try: 
     form = NewProjectForm(request.form) 

     if request.method == "POST": 
      if form.validate() == False: 
       flash('Invalid! All fields are required.') 
       return render_template("dashboardNewproject.html", form=form) 

      else: 
       wtype = '' 
       for each in form.wtype(): 
        if each.data: 
         wtype+=' '+each.description 
       msg = Message(form.subject, sender='form.email.data', recipients=['[email protected]']) 
       msg.body = """ 
       From: %s %s \n 
       %s \n %s \n %s \n \n %s 
       """ % (form.name.data, form.email.data, wtype[1:], \ 
         form.wpack.data, form.templates.data, form.comments.data) 
       mail.send(msg) 

       flash('Congratulations! A new project has been submitted.') 
       gc.collect() 

EDIT: я сделал ошибка, но теперь она исправлена. Мне также пришлось внести незначительную модификацию в форму. Протестировано, и это работает.

Вы также можете удалить Length() валидатора из email поля ([email protected] бы отклонен, например, и он уже проверяет действительный адрес электронной почты), а также изменить свое name поле, чтобы быть просто Required() (у некоторых людей ненормальные имена).

+0

Пробовал, Im получает объект 'UnboundField' не имеет атрибутов 'data'. Не уверен, почему элементы кортежа не содержат данных, но каждая переменная имеет данные .... –

+0

@KingAnu Попробуйте создать экземпляр формы, заменив 'form = NewProjectForm()' на 'form = NewProjectForm (request.form)' –

+0

@KingAnu Я понял какие вопросы были и отредактировал мой ответ. –