2012-06-17 10 views
6

विफल रहता है मैं वेब विकास में एक असली शुरुआत कर रहा हूं। निम्नलिखित कोड is_valid() चेक पर असफल रहा है। लेकिन मुझे समझ में नहीं आता क्यों: फ़ॉर्म को अपना डेटा पोस्ट-डेटा से भरा जाना चाहिए या नहीं?Django form is_valid()

मॉडल:

class Statement(models.Model): 
    text = models.CharField(max_length=255) 
    user = models.ForeignKey(User) 
    time = models.DateField() 
    views = models.IntegerField() 

ModelForm:

class StatementForm(ModelForm): 
    class Meta: 
     model = Statement 
     widgets = { 
        'time':forms.HiddenInput(), 
        'user':forms.HiddenInput(), 
        'views':forms.HiddenInput(), 
     } 

देखें समारोह:

def new(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = StatementForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): 
      stmt = form.save() 
      path = 'stmt/' + stmt.id 
      return render_to_response(path, {'stmt': stmt}) 
    else: 
     c = {} 
     c.update(csrf(request)) 
     loggedin_user = request.user 
     d = datetime.now() 
     form = StatementForm(request.POST, initial={'time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0}) 
     return render_to_response('new_stmt.html', {'form': form, },context_instance=RequestContext(request)) 

मैं समान विषय नहीं मिला और बहुत कोशिश की। इस तरह मुझे लगता है कि इसे काम करना चाहिए। मुझे वास्तव में सलाह चाहिए।

+4

जाओ: if form.is_valid() के लिए else बयान जोड़ें। आप इसे उत्तर के बगल में चेक मार्क डाल कर ऐसा कर सकते हैं। –

उत्तर

5

अपने मॉडल के सभी फ़ील्ड आवश्यक हैं। तो, form.is_valid() सही होगा, यदि सभी फ़ील्ड सही मानों से भरे हुए हैं और रिक्त नहीं हैं। आपने फ़ील्ड time, user, views छिपा फ़ील्ड के रूप में घोषित किया है। क्या आप निश्चित हैं, कि आपने उन्हें अपने टेम्पलेट फॉर्म में भर दिया है? इसके अलावा, आप ऑटो स्टाम्प फ़ील्ड time = models.DateField() ऑटो स्टाम्प करना चाह सकते हैं। जैसे

time = models.DateField(auto_now=True)`. 

यह आप टेम्पलेट के रूप में अपने आप को द्वारा इसे भरने की जरूरत नहीं है के बाद अपने मॉडल क्षेत्र को संशोधित करें।

आपके विचार को सभी मामलों में HttpResponse ऑब्जेक्ट वापस करना होगा। यदि आपका फॉर्म मान्य नहीं है, यानी form.is_valid() गलत लौटाएगा, तो HttpResponse ऑब्जेक्ट आपके दृश्य द्वारा वापस नहीं किया जाएगा। यह आपकी असफलता का स्रोत हो सकता है। पहले सवाल है कि आप एक विशेष प्रश्न के लिए कहा और सर्वश्रेष्ठ उत्तर स्वीकार करते हैं (अगर इन में से एक है) किया है

from django.http import Http404 
def new(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = StatementForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): 
      stmt = form.save() 
      path = 'stmt/' + stmt.id 
      return render_to_response(path, {'stmt': stmt}) 
     else: 
      # Do something in case if form is not valid 
      raise Http404 
    else: 
     # Your code without changes 
+0

धन्यवाद, यह स्पष्ट रूप से मेरे कोड का सुधार है। मेरे डेटाबेस के लिए मुझे इस प्रारूप में दिनांक की आवश्यकता है: d.strftime ("% वाई-% एम-% डी% एच:% एम:% एस")। क्या मॉडल में तारीख को शुरू करना संभव होगा जैसे मेरा एक विशेष प्रारूप? – JoeFox

+1

जब 'dateField' के लिए' auto_now' का उपयोग किया जाता है, तो वर्तमान दिनांक के साथ 'datetime.date' ऑब्जेक्ट को मान के रूप में पास किया जाता है। और जब आपको 'डेटफ़िल्ल्ड' को पढ़ने की आवश्यकता होती है, तो आप अपने पसंदीदा प्रारूप को चुन सकते हैं। साथ ही, जहां तक ​​मुझे पता है, 'डेटफिल्ड' केवल तारीख ही स्टोर करेगा, यानी केवल यह हिस्सा '% वाई-% एम-% डी'। यदि आपको दिनांक और समय स्टोर करने की आवश्यकता है, तो आपको 'डेटटाइमफ़िल्ल्ड' का उपयोग करना चाहिए। देखो [डेटफिल्ड] (https://docs.djangoproject.com/en/dev/ref/models/fields/#datefield) और [डेटटाइमफ़ील्ड] (https://docs.djangoproject.com/en/dev/ref/models /) क्षेत्रों/# datetimefield। – stalk

2

बदलें इस लाइन:

form = StatementForm(request.POST, initial={'time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0}) 

इस के लिए:

form = StatementForm(initial={'time': d.strftime("%Y-%m-%d %H:%M:%S"), 'user':loggedin_user, 'views':0}) 
+0

धन्यवाद, यह मेरे लिए काम किया। – JoeFox

+2

प्रतीक्षा करें, दोनों के बीच क्या अंतर है? मेरा मतलब है, मैं अनुरोध देख सकता हूं। POST गुम है ... लेकिन यह कैसे मदद करता है? – bharal