2010-12-19 3 views
11

मैं Django रूपों का उपयोग कर रहा हूँ। मैं मॉडल परत में मान्य कर रहा हूँ:मैं अपने Django के views.py में सत्यापन प्रमाणीकरण कैसे बढ़ा सकता हूं (या ऐसा कुछ करता हूं)?

def clean_title(self): 
    title = self.cleaned_data['title'] 
    if len(title) < 5: 
     raise forms.ValidationError("Headline must be more than 5 characters.") 
    return title 

हालांकि, कुछ चीजें हैं जो मैं views.py में मान्य करने के लिए की जरूरत है। उदाहरण के लिए ... आखिरी बार जब उपयोगकर्ता ने एक मिनट पहले कुछ पोस्ट किया था?

उस तरह की सामग्री के लिए request.user की आवश्यकता होती है, जिसे मॉडल परत नहीं मिल सकती है। तो, मुझे views.py में मान्य होना चाहिए। मैं इस तरह की सटीक चीज़ करने के लिए views.py में कुछ कैसे करूं?

raise forms.ValidationError("Headline must be more than 5 characters.") 
+1

यह मॉडल परत में मान्य नहीं दिखता है (जैसे django.db.models.Model। क्या आप django.forms.Form/ModelForm परत का मतलब है? मुझे लगता है कि –

+0

मेरे पास एक अलग कारण के लिए एक समान आवश्यकता है: पृष्ठ पर निर्भर करता है, केवल एक फ़ील्ड है, इसलिए दृश्य को इसे लागू करने की आवश्यकता होती है क्योंकि यह पृष्ठ पर कसकर जोड़ती है। –

उत्तर

12

मुझे लगता है कि gruszczy का जवाब एक अच्छा है, लेकिन यदि आप जेनेरिक सत्यापन के बाद हैं जो आपको लगता है कि वे केवल वेरिएबल्स को शामिल करते हैं, तो यहां एक विकल्प है: फॉर्म में तर्क के रूप में वर्रों में पास करें और उनके साथ सौदा करें फॉर्म की मुख्य साफ() विधि में।

अंतर/लाभ यह है कि आपका विचार सरल रहता है और प्रपत्र सामग्री से संबंधित सभी चीजें फॉर्म में स्वीकार्य होती हैं।

जैसे:

# IN YOUR VIEW 
# pass request.user as a keyword argument to the form 
myform = MyForm(user=request.user) 


# IN YOUR forms.py 
# at the top: 

from myapp.foo.bar import ok_to_post # some abstracted utility you write to rate-limit posting 

# and in your particular Form definition 

class MyForm(forms.Form) 

    ... your fields here ... 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') # cache the user object you pass in 
     super(MyForm, self).__init__(*args, **kwargs) # and carry on to init the form 


    def clean(self): 
     # test the rate limit by passing in the cached user object 

     if not ok_to_post(self.user): # use your throttling utility here 
      raise forms.ValidationError("You cannot post more than once every x minutes") 

     return self.cleaned_data # never forget this! ;o) 

ध्यान दें कि clean() विधि में एक सामान्य ValidationError को ऊपर उठाने myform.non_field_errors में त्रुटि डाल देंगे ताकि आप सुनिश्चित करें कि आपके टेम्पलेट {{form.non_field_errors}} शामिल करता है, तो आप स्वयं अपनी प्रपत्र प्रदर्शित कर रहे हैं बनाने के लिए होगा

+0

ग्रेट सॉल्यूशन को फिर से टाइप किए बिना, 50 सेकेंड का इंतजार कर सकता है, और फिर डेटा जमा कर सकता है। क्या यह एक हैक है? हालांकि मुझे यह पसंद है, ty – TIMEX

+0

नहीं, मैं इसे एक हैक नहीं कहूंगा। यह सिर्फ Django फॉर्म कक्षाओं को डिफ़ॉल्ट/ट्यूटोरियल दृष्टिकोण से अधिक लेवरेज कर रहा है। मैंने इसे बहुत सारे स्थानों का उपयोग किया है और (जब तक आप जानते हैं कि पॉप() क्या करेगा, इसमें यह kwargs से कीवर्ड तर्क को हटा देता है, आपको पकड़ने के लिए कुछ भी नहीं है। अगर आप इसे हटाना नहीं चाहते हैं kwargs से, इसके बजाय get() का उपयोग करें। –

4

आप दृश्यों के रूप में उन अपवादों के रूप में ValidationError विचारों में उपयोग नहीं करते हैं। इसके बजाय, आपको उपयोगकर्ता को किसी अन्य यूआरएल पर रीडायरेक्ट करना चाहिए, जो उसे समझाएगा कि वह जल्द ही इसे फिर से पोस्ट नहीं कर सकता है। इस सामान को संभालने का यह सही तरीका है। ValidationError को Form उदाहरण के अंदर उठाया जाना चाहिए, जब इनपुट डेटा मान्य नहीं होता है। यह मामला नहीं है।

+0

मुझे लगता है कि यह एक अच्छा दृष्टिकोण है, लेकिन उपयोगिता के दृष्टिकोण से यह उस संदेश को फ़्लैश/django.contrib.messages संदेश के रूप में जोड़ने के लिए बेहतर होगा और * नहीं * एक नए पृष्ठ पर रीडायरेक्ट करें, लेकिन बस प्रस्तुत करें भरे हुए फॉर्म फिर से। इस तरह, उपयोगकर्ता सभी –

2

आप विचारों में संदेशों का उपयोग कर सकते हैं:

from django.contrib import messages 

messages.error(request, "Error!") 

प्रलेखन: https://docs.djangoproject.com/es/1.9/ref/contrib/messages/

+0

संदेश एक साधारण फ़ॉर्म त्रुटि के लिए एक सरल प्रभावी समाधान है। – MagicLAMP

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