2013-07-06 44 views
40

保存表單時出現此錯誤: 「」需要字段值「 surveythread「之前,可以使用這種多對多的關係。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 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和Python。如果需要,我可以發佈調試跟蹤或遷移文件,但我覺得這是一個簡單的修復。顯然重點是我想爲每個調查結果保存多個調查線索。

謝謝!

+0

其實,確切的錯誤信息和回溯對我們來說是非常有用的給你和答案。 –

+0

我添加了完整的錯誤信息並追溯到原始線程。 – tlovett1

回答

3

在這部分代碼在forms.py,你的SurveyThread對象上設置surveyNone,但它不允許根據您models.pyNone

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多對多領域可以產生問題。如果你想在同一組的調查從self複製到s你應該這樣做迭代他們是這樣的:

如果產生了同樣的錯誤,然後嘗試做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

我也有類似的問題。你的暗示讓我的一天成真!錯誤消息對我來說太困難了......在這個多對多關係可以被使用之前,「」需要有一個字段「surveythread」的值。「surveythread」字段實際上意味着表'parent_survey'中的字段。 – stanleyxu2005

相關問題