Как сделать поле условно необязательным в WTForms?

Проверка моей формы почти завершена, у меня всего 2 случая, которые я точно не знаю, как решить: 1) Пароль поле должно быть обязательным, конечно, но я также предоставляю возможность войти в систему с учетной записью google или facebook через OAuth, а затем имя будет предварительно заполнено, но я полностью удаляю поле пароля из формы, если есть пользователь (google) или объект пользователя facebook :

<tr><td>
  <br />        {% if user or current_user %}    {% else %} 

  <div class="labelform">
     {% filter capitalize %}{% trans %}password{% endtrans %}{% endfilter %}:
  </div>
      </td><td>  <div class="adinput">{{ form.password|safe }}{% trans %}Choose a password{% endtrans %}</div>{% endif %}

  </td></tr>

Итак, для тех пользователей, которые уже вошли в систему и поле пароля не имеет значения, мне нужна логика, чтобы сделать это поле условно необязательным.Я думал, что мог бы иметь переменную для logged_in + метод в моем классе формы, например:

class AdForm(Form):
    logged_in = False
    my_choices = [('1', _('VEHICLES')), ('2', _('Cars')), ('3', _('Bicycles'))]
    name = TextField(_('Name'), [validators.Required(message=_('Name is required'))], widget=MyTextInput())
    title = TextField(_('title'), [validators.Required(message=_('Subject is required'))], widget=MyTextInput())
    text = TextAreaField(_('Text'),[validators.Required(message=_('Text is required'))], widget=MyTextArea())
    phonenumber = TextField(_('Phone number'))
    phoneview = BooleanField(_('Display phone number on site'))
    price = TextField(_('Price'),[validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')),validators.Optional()] )
    password = PasswordField(_('Password'),[validators.Optional()], widget=PasswordInput())
    email = TextField(_('Email'), [validators.Required(message=_('Email is required')), validators.Email(message=_('Your email is invalid'))], widget=MyTextInput())
    category = SelectField(choices = my_choices, default = '1')

    def validate_name(form, field):
        if len(field.data) > 50:
            raise ValidationError(_('Name must be less than 50 characters'))

    def validate_email(form, field):
        if len(field.data) > 60:
            raise ValidationError(_('Email must be less than 60 characters'))

    def validate_price(form, field):
        if len(field.data) > 8:
            raise ValidationError(_('Price must be less than 9 integers'))

    def validate_password(form, field):
        if not logged_in and not field:
            raise ValidationError(_('Password is required'))

Сработает ли приведенный выше validate_password для достижения желаемого эффекта? Есть другой способ лучше? Другой способ, который я мог бы подумать, - это иметь 2 разных класса формы, и в сообщении http я создаю экземпляр класса формы, который должен быть:

def post(self):
    if not current_user:
      form = AdForm(self.request.params)
    if current_user:
      form = AdUserForm(self.request.params)

Мне также нужна условная проверка для поля категории, когда выбрана определенная категория, появляется больше вариантов, и эти должен иметь валидацию только для определенной базовой категории, например. пользователь выбирает «Автомобиль», а затем через Ajax может выбрать регистрационные данные и пробег для автомобиля, и эти поля являются обязательными, учитывая, что была выбрана категория «Автомобиль».

Так что это могут быть два вопроса, но оба случая относятся к тому, как я могу сделать поле «условно необязательным» или «условно обязательным».

Моя форма выглядит так

enter image description here

И для вошедшего в систему пользователя я предварительно заполняю имя и адрес электронной почты, а поле пароля просто не используется, поэтому поле пароля не подходит для того, чтобы быть «необязательным» или «обязательным», это было бы нужно что-то вроде «условно необязательный» или «условно обязательный».

enter image description here

Спасибо за любой ответ или комментарий

27
задан Niklas Rosencrantz 11 December 2011 в 10:18
поделиться