2013-07-06 2 views
40

कोई फॉर्म सहेजते समय मुझे यह त्रुटि मिल रही है: "" फ़ील्ड के लिए मूल्य होना चाहिए " सर्वेक्षण से पहले "इस से कई रिश्तों का उपयोग किया जा सकता है।Django त्रुटि: फ़ील्ड के लिए मूल्य होना चाहिए "..." इससे पहले कि कई से अधिक रिलेशनशिप का उपयोग किया जा सके

Models.py:

class SurveyResult(models.Model): 
    stay = models.OneToOneField(Stay, related_name='survey') 
    created = models.DateTimeField(default=datetime.now) 
    vote = models.BooleanField(default=False) 
    vote_service = models.BooleanField(default=False) 
    comment = models.TextField(blank=True, null=True) 

    def getThreads(self): 
     return SurveyThread.objects.filter(parent_survey = self) 

    threads = property(getThreads) 

    def __unicode__(self): 
     return self.vote and 'Good' or 'Bad' 

    class Meta: 
     get_latest_by = '-created' 

class SurveyThread(models.Model): 
    survey = models.ManyToManyField(SurveyResult, related_name='parent_survey') 
    email = models.EmailField(max_length=200) 
    comment = models.TextField(blank=True, null=True) 

views.py:

survey_list = SurveyResult.objects.filter(stay__guest__user=request.user) \ 
             .select_related('stay', 'stay__guest') 

forms = {} 
for survey in survey_list: 
    forms[survey] = SurveyThreadForm(data=request.POST or None, survey=survey) 

    if forms[survey].is_valid(): 
    instance = forms[survey].save() 
    return redirect('.') 

forms.py

class SurveyThreadForm(forms.Form): 

    comment = forms.CharField(required=False, widget=forms.Textarea) 

    def __init__(self, *args, **kwargs): 
     self.survey = kwargs.pop('survey', None) 

     if not self.survey: 
      raise NotImplementedError("SurveyResult object is required at this moment") 

     super(SurveyThreadForm, self).__init__(*args, **kwargs) 

     self.fields['comment'].label = "Message to send to guest:" 

    def save(self, commit=True): 
     s = SurveyThread() 
     s.survey = self.survey 
     s.email = "[email protected]" 
     s.comment = self.cleaned_data['comment'] 

     if commit: 
      s.save() 
     return s 

त्रुटि संदेश:

ValueError at/
"<SurveyThread: SurveyThread object>" needs to have a value for field "surveythread" before this many-to-many relationship can be used. 
Request Method: POST 
Request URL: http://127.0.0.1:8000/ 
Django Version: 1.5.1 
Exception Type: ValueError 
Exception Value:  
"<SurveyThread: SurveyThread object>" needs to have a value for field "surveythread" before this many-to-many relationship can be used. 
Exception Location: /Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages/django/db/models/fields/related.py in __init__, line 586 
Python Executable: /Users/tlovett1/.virtualenvs/guestretain/bin/python 
Python Version: 2.7.2 
Python Path:  
['/Users/tlovett1/guestretain', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages/pip-1.3.1-py2.7.egg', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python27.zip', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/plat-darwin', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/plat-mac', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Users/tlovett1/.virtualenvs/guestretain/Extras/lib/python', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/lib-tk', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/lib-old', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/lib-dynload', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages', 
'/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages/PIL'] 
Server time: Sun, 7 Jul 2013 10:22:55 -0500 

Traceback:

Traceback Switch to copy-and-paste view 

/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages/django/core/handlers/base.py in get_response 
         response = callback(request, *callback_args, **callback_kwargs) ... 
▶ Local vars 
/Users/tlovett1/guestretain/retain/apps/profiles/utils.py in _wrapped_view 
        return view_func(request, *args, **kwargs) ... 
▶ Local vars 
/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages/endless_pagination/decorators.py in decorated 
      return view(request, *args, **kwargs) ... 
▶ Local vars 
/Users/tlovett1/guestretain/retain/apps/dashboard/views.py in dashboard 
      instance = forms[survey].save() ... 
▶ Local vars 
/Users/tlovett1/guestretain/retain/apps/surveys/forms.py in save 
     s.survey = self.survey ... 
▶ Local vars 
/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages/django/db/models/fields/related.py in __set__ 
     manager = self.__get__(instance) ... 
▶ Local vars 
/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages/django/db/models/fields/related.py in __get__ 
      through=self.field.rel.through, ... 
▶ Local vars 
/Users/tlovett1/.virtualenvs/guestretain/lib/python2.7/site-packages/django/db/models/fields/related.py in __init__ 
           (instance, source_field_name)) ... 
▶ Local vars 

मैं Django और पायथन के लिए नया हूँ। यदि आवश्यक हो तो मैं डीबग ट्रेस या माइग्रेशन फ़ाइल पोस्ट कर सकता हूं, लेकिन मुझे लगता है कि यह एक साधारण फिक्स है। जाहिर है, मुद्दा यह है कि मैं प्रत्येक सर्वेक्षण परिणाम के लिए कई सर्वेक्षण धागे को सहेजना चाहता हूं।

धन्यवाद!

+0

वास्तव में, सटीक त्रुटि संदेश और ट्रेसबैक आपके लिए आपको जवाब देने और उत्तर देने के लिए बहुत उपयोगी होगा। –

+0

मैंने मूल त्रुटि में पूर्ण त्रुटि संदेश और ट्रेसबैक जोड़ा। – tlovett1

उत्तर

3

forms.py में कोड के इस भाग में, आप None को SurveyThread वस्तु पर survey क्षेत्र स्थापित कर रहे हैं, फिर भी यह अपने models.py के अनुसार None होने की अनुमति नहीं है:

def save(self, commit=True): 
    s = SurveyThread() 
    s.survey = None  ### This is the problem 
    s.email = "[email protected]" 
    s.comment = self.cleaned_data['comment'] 

    if commit: 
     s.save() 
    return s 

आप सेट करना होगा surveySurveyResult ऑब्जेक्ट से पहले आप इसे सहेज सकते हैं, या मॉडल में None होने की अनुमति दें।

मुझे लगता है कि आप यह कहना बदलना चाहते हैं:

s.survey = self.survey 
+0

ओह। मुझे माफ कर दो। मुझे अभी भी s.survey = self.survey के साथ त्रुटि मिल रही है। जब मैं डिबगिंग कर रहा था और इसे वापस बदलने के लिए भूल गया तो मैंने इसे किसी भी में बदल दिया। मैंने इसे प्रतिबिंबित करने के लिए अपनी मूल पोस्ट अपडेट की। – tlovett1

40

ठीक है, कोड थोड़ा जटिल होता है, मुझे यकीन है कि आप tackling your problem with ModelForms बेहतर होगा हूँ। मुझे लगता है समस्या वास्तव में लाइन है:

s.survey = self.survey 

क्योंकि s वस्तु अभी तक डेटाबेस के लिए लिखा नहीं किया गया है, तो यह survey ManyToMany क्षेत्र की समस्याओं उपज कर सकते हैं तक पहुँचने। आप s को self से सर्वेक्षण का एक ही सेट की प्रतिलिपि बनाना चाहते हैं तो आप इसे इस तरह उन पर पुनरावृत्ति करना चाहिए:

यह एक ही त्रुटि पैदावार है, तो s.save() पहले करने की कोशिश की और बाद में आइटम कॉपी:

s.save() 
for item in self.survey: 
    s.survey.add(item) 

आपका कोड इस तरह रहने की संभावना है:

def save(self, commit=True): 
    s = SurveyThread() 
    # these fields aren't problematic 
    s.email = "[email protected]" 
    s.comment = self.cleaned_data['comment'] 
    # you can add s.save() here to remove problems associated with object 
    # not yet persisted 
    # s.save() 
    for item in self.survey: 
     s.survey.add(item) 
    if commit: 
     s.save() 
    return s 

मैं तुम्हें एक if commit: है वस्तु लागू करने के लिए देख सकते हैं, तो यह का उपयोग करने के कोड को समायोजित करने का प्रयास करें। यदि मेरे उत्तर का पहला संस्करण काम करता है तो आप अंत में s.save() के साथ ठीक होंगे, अगर दूसरा काम करने वाला व्यक्ति है, तो आपको commit मान पर चिपकने के लिए थोड़ा कोड समायोजित करना होगा।

आशा है कि इससे मदद मिलती है!

+0

यह था। धन्यवाद! – tlovett1

+1

मुझे भी इसी तरह की समस्या है। आपका संकेत मेरा दिन बना दिया! त्रुटि संदेश मुझे इतना भ्रमित कर रहा है ... '" <सर्वेक्षण थ्रेड: सर्वे थ्रेड ऑब्जेक्ट> "फ़ील्ड" सर्वेथ्रेड "के लिए एक मूल्य होने की आवश्यकता है इससे पहले कि कई से अधिक रिश्तों का उपयोग किया जा सके। 'फ़ील्ड' सर्वेथ्रेड 'वास्तव में इसका मतलब है तालिका 'parent_survey' में एक फ़ील्ड। – stanleyxu2005

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

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