Моя проверка формы почти завершена, у меня есть только 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 может выбрать регистрационные данные и пробег для автомобиля, и эти поля обязательны для заполнения, если была выбрана категория «Автомобиль».
Так что это могут быть два вопроса, но оба случая касаются того, как я могу сделать поле "условно необязательным" или "условно обязательным".
Моя форма выглядит так
А для вошедшего в систему пользователя я предварительно заполняю имя и адрес электронной почты, и поле пароля просто не используется, поэтому поле пароля не подходит ни как «необязательный», ни «обязательный», ему потребуется что-то вроде «условно необязательный» или «условно требуется».
Спасибо за любой ответ или комментарий