Django

2009-06-02 5 views
6

में एक स्लग मान्य करना मुझे लगता है कि यह regexp या कुछ शामिल करने जा रहा है, लेकिन मैं इसे एक शॉट दे दूंगा। मिनट में, उपयोगकर्ता शीर्षक क्षेत्र में £$(*£$(£@$&£($ जैसा कुछ टाइप करके वेबसाइट तोड़ सकता है, जिसे Django slugify का उपयोग करके एक स्लग में परिवर्तित किया जाता है।Django

क्योंकि इनमें से कोई भी वर्ण परिवर्तित नहीं किया जा सकता है, Django एक त्रुटि देता है। मेरा सवाल यह है कि, उपयोगकर्ता forms.ValidationError को बढ़ाने के लिए फॉर्म सत्यापन विधि में क्या रखना चाहिए जब उपयोगकर्ता इस तरह के शीर्षक का उपयोग करता है?

धन्यवाद।

उत्तर

10

यह प्रश्न आधा दशक पुराना है इसलिए मेरा प्रश्न अपडेट करने में मुझे समझाया जाना चाहिए कि मैं कम से कम अतीत में घूम रहा हूं जहां कुछ सुविधाएं मौजूद नहीं हो सकती हैं।

इन दिनों रूपों में स्लग को संभालने का सबसे आसान तरीका केवल django.models.SlugField का उपयोग करना है। यह आपके लिए स्वयं को मान्य करेगा और यह दर्शाता है कि यह क्षेत्र एक सूचकांक है।

आप एक मॉडल पर इस प्रयोग नहीं कर रहे हैं, तो आप अभी भी वही सत्यापनकर्ता कि SlugField का उपयोग करता है में हुक कर सकते हैं:

from django.core.validators import validate_slug 

slug = forms.CharField(..., validators=[validate_slug]) 

तुम सिर्फ परदे के पीछे की जाँच कर सकते हैं या अपने खुद के लिखने के लिए चाहते हैं वैधकर्ता, आप एक वैध स्लग की Django की परिभाषा को खींचने के लिए एक समान तकनीक का उपयोग कर सकते हैं।

from django.core.validators import slug_re 

if slug_re.match(...): 
    ... 

मैं कल्पना नहीं कर सकते यह बदल जाएगा, लेकिन एक स्लग के Django के विचार करने के लिए अपने आप को लॉक करके, आप निरंतरता सुनिश्चित करेंगे Django एक दिन बदलने करता है: यह सिर्फ संकलित regex कि ऊपर validate_slug का उपयोग करता है।

+2

काम करने लगता है। बहुत बहुत धन्यवाद। Clean_field विधि में: यदि re.match ("[a-zA-Z0-9] +", संभावित_slug) == कोई नहीं: रूपों को बढ़ाएं। वैधता त्रुटि ("शीर्षक स्लग्जेबल नहीं है।") – user116170

+0

यह regex नहीं करता है ' slugs में हाइफ़न "-" के बहुत आम उपयोग के लिए टी खाता। इसके अलावा, \ d अनावश्यक है क्योंकि \ w अंकों को भी शामिल करता है। नीचे बेन का जवाब अधिक सही है। – Humphrey

+0

नीचे बेन का उत्तर अधिक सही है। [ए-जेए-जेड 0-9] + न तो अंडरस्कोर और न ही हाइफ़न से मेल खाता है, [\ w \ d] + अंडरस्कोर से मेल खाता है लेकिन हाइफ़न नहीं। –

12
SLUG_REGEX = re.compile('^[-\w]+$') 
+1

मेरा मानना ​​है कि यह रेगेक्स ओली की तुलना में बेहतर है क्योंकि यह आपके स्लग को "-" रखने की अनुमति देता है। – Humphrey