Я не уверен, был ли я просто тупиком, но следующее сработало (и отвечает на весь мой вопрос):
класс OrderForm (ModelForm):
Класс Meta:
модель = заказ
def clean_shipping_street(self):
print 'VALIDATING!!! YEY!'
if self.cleaned_data['ship_to_billing']:
return self.clean_billing_street()
return super(OrderForm, self).clean_shipping_street()
Но если вы думаете, что я поступаю неправильно, пожалуйста, дайте мне знать!
Как Ник указывает ниже, cleaned_data не заполняется в гарантированном порядке, что означает, что ship_to_billing
может не существовать, когда вызывается clean_shipping_street()
. Чтобы обойти это, нужно вызвать метод clean_shipping_street()
вместо доступа к cleaned_data
.
def clean_shipping_street(self):
print 'VALIDATING!!! YEY!'
if self.clean_ship_to_billing():
return self.clean_billing_street()
return super(OrderForm, self).clean_shipping_street()
Если бы вы не были такими ленивыми, как я, когда я писал код, вы можете избежать такого количества повторяющихся проверок логического поля. Это должно быть быстрее (при условии, что поле по умолчанию не запускается, если это не нужно - я не уверен в этом сам):
def clean_shipping_street(self):
print 'VALIDATING!!! YEY!'
if self.cleaned_data.get('ship_to_billing', self.clean_ship_to_billing):
return self.clean_billing_street()
return super(OrderForm, self).clean_shipping_street()
ИЛИ даже лучше, чем:
def clean_shipping_street(self):
if not self.cleaned_data.has_key['ship_to_billing']:
self.cleaned_data['ship_to_billing'] = self.clean_ship_to_billing()
if self.cleaned_data['ship_to_billing']:
return self.clean_billing_street()
return super(OrderForm, self).clean_shipping_street()
Это только немного отличается, но это должно означать, что clean_ship_to_billing () вызывается намного меньше, чем мои предыдущие попытки. А если серьезно, я сомневаюсь, что вы могли даже обнаружить эти «улучшения» в сеансе профилирования.