سؤال

السيناريو:أنا بناء على أمر النموذج.مثل كل أمر آخر شكل على كوكب الأرض, فقد منفصلة الفواتير وعناوين الشحن.لقد أضاف "استخدام عنوان الفواتير" خانة الاختيار السماح للمستخدم حفظ الوقت.

المشكلة أن الشحن المجالات لا تزال هناك.أنها سوف تفشل التحقق إذا كان المستخدم لا تدخل أي عنوان الشحن البيانات (مثل إذا كانوا يريدون استخدام عنوان الفواتير).

ما أود أن تفعل تجاوز ModelForm التحقق من صحة هذه مكررة المجالات.هناك إذا تم تحديد خانة (غير متأكد من كيفية الحصول على هذه البيانات من خلال المصادقة) ، إعادة إصدار الفواتير.إذا لم يكن تحققت تمر عليه العودة إلى الأصل التحقق من الصحة.

يبدو وكأنه خطة أليس كذلك ؟ حسنا لقد وقعت في العقبة الأولى.بلدي clean_functions لا تعمل.لا يبدو أنهم حتى يطلق.

هنا بعض التعليمات البرمجية:

# shipping_street is a field in my Order Model

class OrderForm(ModelForm):
    class Meta:
        model = Order

    def clean_shipping_street(self):
        print "JUST GET ME SOME OUTPUT!!!"
        raise forms.ValidationError('RAWRAWR')

وهنا كيف أنا اختبار:

def checkout(request):
    of = OrderForm()
    if request.method == "POST":
        of = OrderForm(request.POST)
        print 'Form valid:', of.is_valid()

    # ...
    # return my HttpResponse with 'of' in the context.
هل كانت مفيدة؟

المحلول 2

وكانت هناك العديد من المشاكل مع جوابي الماضية. لم المقدمة البيانات المنسوخة مرة أخرى في شكل (قد يكون ما تريد، وأنا لا) وكان لا يمكن الاعتماد عليها قليلا.

وهنا هو ما أنا باستخدام الآن. بدلا من إضافة عشرات التعاريف clean_field_name()، وأنا واحد فقط على BooleanField:

def clean_ship_to_billing(self):
    if self.cleaned_data.get('ship_to_billing', False):
        data = self.data.copy()
        for f in ['street', 'street_2', 'post_code', 'city', 'county', 'country', ]:
            data['shipping_%s' % f] = data['billing_%s' % f]
        self.data = data

إذا تم، فإنه ينسخ البيانات الخام عبر حقول الفواتير في مجالات الشحن. من المهم أن الحقل قبل مجالات الشحن في (أو النموذج) النظام حقل النموذج.

وأنا نسخ self.data لأن البيانات وظيفة غير قابل للتغيير.

نصائح أخرى

أنا لست متأكدا مما إذا كنت فقط clutz ولكن بعد عمل (و جواب كل سؤال):

فئة OrderForm(ModelForm):الطبقة الفوقية:نموذج = النظام

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() يحصل تسمى أقل كثيرا من الجهود السابقة.ولكن على محمل الجد, أشك حتى يمكن الكشف عن هذه "تحسينات" في التنميط الدورة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top