2012-06-06 14 views
5

में सशर्त क्षेत्र मुझे एक फॉर्म क्लास बनाने की आवश्यकता है जिसमें उपयोगकर्ता लॉग इन हो या नहीं, इस पर निर्भर करता है कि ReCaptcha फ़ील्ड हो या नहीं।फॉर्म

क्योंकि यह एक टिप्पणीफॉर्म है, इसलिए मुझे फॉर्म निर्माण/परिभाषा पर request ऑब्जेक्ट तक पहुंच नहीं है, इसलिए मैं उस पर भरोसा नहीं कर सकता।

POST अनुरोध समाधान के लिए आसान है: मैं इस मिल गया है:

class ReCaptchaCommentForm(CommentForm): 
    def __init__(self, data=None, *args, **kwargs): 
     super(ReCaptchaCommentForm, self).__init__(data, *args, **kwargs) 
     if data and 'recaptcha_challenge_field' in data: 
      self.fields['captcha'] = ReCaptchaField() 

यह किया होने के रूप में इरादा, फ़ॉर्म सत्यापन काम करना चाहिए। समस्या अब टेम्पलेट पक्ष पर है। मैं इस तरह होने के लिए टेम्पलेट की जरूरत है:

<form action={% comment_form_target %} method="post"> 
{# usual form stuff #} 
{% if not user.is_authenticated %} 
<script type="text/javascript" 
     src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script> 
<div id="recaptcha-div"></div> 
<script type="text/javascript"> 
    Recaptcha.create({{ public_key }}, "recaptcha-div", 
        { theme: 'white', 
        callback: Recaptcha.focus_response_field }); 
</script> 
{% endif %} 
</form> 

लेकिन मैं हर comments/*/form.html टेम्पलेट पर कि कोड को दोहराना नहीं चाहते हैं। मैं इकट्ठा करता हूं कि विजेट की render विधि और Media परिभाषा से समकक्ष कोड जोड़ने का कोई तरीका होना चाहिए।

क्या कोई ऐसा करने का एक अच्छा तरीका सोच सकता है?

+1

समस्या यह है कि विजेट अनुरोध के बारे में कुछ भी नहीं जानते हैं, इसलिए लॉग इन उपयोगकर्ता के आधार पर सशर्त रूप से प्रस्तुत करने का कोई तरीका नहीं है। हालांकि, आप django-floppyforms को देखना चाह सकते हैं। चूंकि यह विगेट्स को प्रस्तुत करने के लिए टेम्पलेट का उपयोग करता है, इसलिए यह संभव है कि आप वही कर सकें जो आप चाहते हैं। –

+0

हां, यह मेरा विचार है, एक टेम्पलेट के माध्यम से एक विजेट प्रस्तुत करें। लेकिन मुझे यकीन नहीं है कि मेरे टेम्पलेट वर्र्स में request.user हो सकता है, भले ही मैं ऐसा करता हूं (widget.render जो कुछ भी चाहता है वह कर सकता है, जिसमें टेम्पलेट को प्रस्तुत करना शामिल है, संदर्भ समस्या है)। मैं एक टेम्पलेट प्रस्तुत करना चाहता हूं, जिसे बाद में – Lacrymology

+1

पर पार्स किया जाएगा इसलिए मैंने django-floppyforms का सुझाव दिया। मुझे पूरी तरह से यकीन नहीं है, लेकिन मुझे लगता है कि यह टेम्पलेट का उपयोग करने के बजाय मानक में शामिल है, पैटर्न को शामिल करने के बजाय। किसी भी अन्य टेम्पलेट की तरह टेम्पलेट संदर्भ में 'अनुरोध' तक पहुंच होनी चाहिए।इसे आज़माएं और देखें। –

उत्तर

4

मुझे लगता है कि आप एक दृश्य में अपने प्रपत्र instatiate है, तो आप सिर्फ (बस प्रमाणन अनुप्रयोग में तरह SetPassword फार्म) फार्म के लिए अनुरोध से उपयोगकर्ता गुजारें सकता:

def __init__(self, user, data=None, *args, **kwargs): 
    super(ReCaptchaCommentForm, self).__init__(data, *args, **kwargs) 
    if user.is_authenticated(): 
     self.fields['captcha'] = ReCaptchaField() 
+0

नहीं, टिप्पणियां सिस्टम इस तरह काम नहीं करता है (यह एक दृश्य नहीं है, यह एक templatetag है, और यह पैरामीटर के रूप में अनुरोध (या उपयोगकर्ता) पास नहीं करता है। यह विवरण का हिस्सा है! – Lacrymology

0

अच्छा, यह दुर्भाग्यपूर्ण है कि django-floppyforms अनुरोध तक पहुंच नहीं देता है। यह जानना अच्छा लगेगा कि यह एक विकल्प था, क्योंकि मैंने हाल ही में अपनी परियोजना में django-floppyforms का उपयोग करना शुरू कर दिया है।

उस से कम, सबसे अच्छी बात यह है कि मैं केवल टेम्पलेट विरासत पर निर्भर होना चाहता हूं। आप comments/form.html फ़ाइल बना सकते हैं और उसके बाद प्रत्येक comments/*/form.html का विस्तार कर सकते हैं। रिकैप्चा कोड को रखें क्योंकि आपके पास आधार form.html है और आप जाने के लिए अच्छे हैं।

+0

से चलाया गया है जो मैंने किया है, लेकिन मुझे एक अच्छा समाधान चाहिए। विशेष रूप से ए) मुझे टिप्पणी प्रणाली के बाहर प्रपत्रों के लिए ऐसा करने की आवश्यकता होगी, और बी) यह छोटा होना चाहिए – Lacrymology

+0

ठीक है, यह * प्रकार * तुच्छ है। आपको केवल एक स्क्रिप्ट टेम्पलेट में स्क्रिप्ट जोड़नी है जिसे सभी रूपों से प्राप्त होता है। और, यदि आपको टिप्पणी प्रणाली के बाहर इसकी आवश्यकता है, तो कुछ भी नहीं कह रहा है कि आपके पास मुख्य टेम्पलेट निर्देशिका में तुरंत उच्च स्तर का form.html टेम्पलेट नहीं हो सकता है, यह ऐप और अन्य सभी ऐप्स जिन्हें इसकी आवश्यकता है । –

3

उपयोग crispy-forms! आप फ़ॉर्म लेआउट में एचटीएमएल तत्व शामिल कर सकते हैं जो आपको दृश्य अनुरोध संदर्भ के आधार पर फ़ील्ड को बहिष्कृत/शामिल करने की अनुमति देगा। इसके बाहर भी बेहद उपयोगी विशेषताएं।

Here's the relevant doc section.

+0

ओह, मैं कुछ अन्य चीजों को ठीक करने के बाद मैं इस कार्य पर वापस आऊंगा। मैं वास्तव में पहले से ही कुरकुरे रूपों सहित हूं लेकिन मैंने अभी तक इसका उपयोग नहीं किया है, क्योंकि हम एक और टेम्पलेट संचालित विधि का उपयोग करते हैं। – Lacrymology

0

मैं सशर्त क्षेत्रों के बारे में क्या कर रहा हूँ एक आधार वर्ग (जो Form से विरासत) और अतिरिक्त सशर्त क्षेत्रों के साथ अन्य उपवर्गों हो रही है।

फिर मेरे विचार में, इस शर्त के आधार पर कि मैं आवश्यक उपclassed फॉर्म चुनता हूं। मुझे पता है कि इसमें कुछ डुप्लिकेट कोड शामिल हैं, लेकिन यह अन्य दृष्टिकोणों की तुलना में आसान लगता है।