Xác thực biểu mẫu của tôi đang hoạt động gần như hoàn tất, tôi chỉ có 2 trường hợp tôi không biết chính xác cách giải quyết: 1) Trường mật khẩu tất nhiên là bắt buộc nhưng tôi cũng cung cấp khả năng đăng nhập bằng tài khoản google hoặc facebook thông qua OAuth và sau đó tên được điền trước nhưng tôi loại bỏ trường mật khẩu hoàn toàn khỏi biểu mẫu là có một người dùng (google) hoặc một đối tượng người dùng 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>
Vì vậy, đối với những người dùng này đã đăng nhập và trường mật khẩu không có ý nghĩa, tôi cần một số logic để làm cho trường đó có điều kiện là tùy chọn. Tôi đã nghĩ rằng tôi có thể có một biến cho logged_in + một phương thức trong lớp biểu mẫu của mình, chẳng hạn như sau:
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'))
Liệu validate_password trên có hoạt động để đạt được hiệu quả mong muốn không? Có cách nào khác tốt hơn không? Một cách khác tôi có thể nghĩ là có 2 lớp biểu mẫu khác nhau và trong bài đăng http, tôi cài đặt lớp biểu mẫu đó phải là:
def post(self):
if not current_user:
form = AdForm(self.request.params)
if current_user:
form = AdUserForm(self.request.params)
Tôi cũng cần xác thực có điều kiện cho trường danh mục, khi một danh mục nhất định được chọn thì nhiều lựa chọn hơn sẽ xuất hiện và những lựa chọn này chỉ nên xác thực cho một danh mục cơ sở nhất định, ví dụ. người dùng chọn "Xe" và sau đó thông qua Ajax có thể chọn dữ liệu đăng ký và số dặm cho xe và các trường này là bắt buộc khi danh mục Xe đã được chọn.
Vì vậy, nó có thể là hai câu hỏi nhưng cả hai trường hợp đều liên quan đến cách tôi có thể tạo một trường "tùy chọn có điều kiện" hoặc "bắt buộc có điều kiện".
Hình thức của tôi trông như thế này
Và đối với người dùng đã đăng nhập, tôi điền trước tên và địa chỉ email và trường mật khẩu chỉ đơn giản là không được sử dụng, vì vậy trường mật khẩu không phù hợp là "tùy chọn" cũng như "bắt buộc", nó sẽ cần một cái gì đó như "tùy chọn có điều kiện" hoặc "bắt buộc có điều kiện . "
Cảm ơn vì bất kỳ câu trả lời hoặc nhận xét nào