2010-07-09 14 views
7

मैं ऐसे विजेट बनाना चाहता हूं जो संबंधित फ़ील्ड में त्रुटियों के दौरान तत्व मार्कअप में विशिष्ट कक्षाएं जोड़ दें।Django: कस्टम विजेट परिभाषा के भीतर से फील्ड त्रुटियों की जांच कैसे करें?

मुझे विजेट परिभाषा कोड के भीतर से किसी क्षेत्र में त्रुटियों से जुड़े त्रुटियों की जांच करने के तरीके के बारे में जानकारी खोजने में कठिनाई हो रही है।

इस समय मेरे पास निम्नलिखित स्टब विजेट कोड है (अंतिम विजेट अधिक जटिल मार्कअप का उपयोग करेगा)।

from django import forms 
from django.utils.safestring import mark_safe 
class CustomTextWidget(forms.Widget): 
     def render(self, name, value, attrs): 
      field_has_errors=False # change to dynamically reflect field errors, somehow 
      if field_has_errors: 
       error_class_string="error" 
      else: 
       error_class_string="" 
      return mark_safe(
      "<input type=\"text\" class=\"%s\" value=\"%s\" id=\"id_%s\" name=\"%s\">" % (error_class_string, value, name, name) 
      ) 

क्या कोई भी field_has_errors Boolean को पॉप्युलेट करने के लिए एक समझदार तरीके से प्रकाश डाल सकता है? (या शायद मैं जो करने की कोशिश कर रहा हूं उसे पूरा करने का एक बेहतर तरीका सुझाता हूं)। अग्रिम में धन्यवाद।

उत्तर

9

जेसन कहते हैं, विजेट क्षेत्र में ही करने के लिए कोई पहुंच नहीं है। मुझे लगता है कि सीएसएस की कैस्केडिंग प्रकृति का उपयोग करना बेहतर समाधान है।

{% for field in form %} 
<div class="field{% if field.errors %} field_error{% endif %}"> 
{{ field }} 
</div> 
{% endfor %} 

अब आप अपने सीएसएस में आप कर सकते हैं:

div.field_error input { color: red } 

या जो भी आप की जरूरत है।

+0

यह निश्चित रूप से जाने का तरीका है और वास्तव में वह दृष्टिकोण है जो मैं हमेशा अपने काम में लेता हूं। मेरे द्वारा प्रदान किया गया उदाहरण विगेट्स (केवल कस्टम विगेट्स नहीं) के गुणों को पारित करने के प्रयास में एक साथ जोड़ दिया गया था, हालांकि इसे टालना नहीं चाहिए क्योंकि यह DRY नहीं है। –

+0

दो साल बाद उसने मेरी मदद की। धन्यवाद :) – Houman

+0

वे त्रुटि जानकारी को विजेट में क्यों नहीं पास करते हैं? ऐसा लगता है कि यह मेरे लिए उचित होगा, क्योंकि फ़ील्ड के इनपुट के ठीक बाद त्रुटियों को प्रस्तुत करना आम है। – Andy

3

विजेट को उस क्षेत्र का कोई ज्ञान नहीं है जिस पर इसे लागू किया जा रहा है। यह वह क्षेत्र है जो त्रुटियों के बारे में जानकारी बनाए रखता है। आप अपने फार्म के init विधि में error_messages के लिए जाँच कर सकते हैं, और उसके अनुसार अपने विजेट के लिए एक त्रुटि वर्ग इंजेक्षन:

class YourForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(YourForm, self).__init__(*args, **kwargs)  
     attrs = {} 
     if self.fields['your_field'].error_messages is not None: 
      attrs['class'] = 'errors' 
     self.fields['your_field'].widget = YourWidget(attrs=attrs) 
+0

बहुत बेहतर DRY उत्तर – Alvaro

संबंधित मुद्दे