2013-07-06 11 views
40

Zapisując formularz, otrzymuję ten błąd: "" musi mieć wartość dla pola " surveyreadread "przed tą relacją wiele do wielu.Błąd Django: musi mieć wartość dla pola "...", zanim będzie można stosować tę relację wiele do wielu.

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 Wiadomość

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 

Błąd:

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 

Jestem nowy Django i Python. W razie potrzeby mogę opublikować plik śledzenia lub plik migracji, ale mam wrażenie, że jest to prosta naprawa. Oczywiście chodzi o to, że chcę zapisać wiele wątków ankiet dla każdego wyniku ankiety.

Dzięki!

+0

W rzeczywistości dokładny komunikat o błędzie i śledzenie byłyby bardzo przydatne dla nas, aby dać ci odpowiedź. –

+0

Dodałem pełny komunikat o błędzie i traceback do oryginalnego wątku. – tlovett1

Odpowiedz

3

W tej części kodu w forms.py, jesteś ustawienie pola survey na obiekcie SurveyThread do None, ale nie wolno mu być None zależności models.py:

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 

Musisz ustawić survey do obiektu SurveyResult, zanim będzie można go zapisać lub pozwolić, aby był w modelu zgodny z .

myślę chcesz zmienić to znaczy:

s.survey = self.survey 
+0

Ups. Przepraszam. Otrzymuję błąd nadal z s.survey = self.survey. Zmieniłem go na None podczas debugowania i zapomniałem go zmienić. Zaktualizowałem mój pierwotny wpis, aby to odzwierciedlić. – tlovett1

40

Ok, kod jest nieco niechlujny, jestem pewien, że będziesz lepiej tackling your problem with ModelForms. Wydaje mi się, problem faktycznie jest linia:

s.survey = self.survey 

ponieważ s obiekt nie został jeszcze napisany do bazy danych, więc dostęp jest survey ManyToMany pole może przynieść problemy. Jeśli chcesz skopiować ten sam zestaw badań z self do s należy zrobić to iteracji nad nimi tak:

jeśli to daje ten sam błąd, a następnie spróbuj zrobić s.save() pierwszy, a później skopiować elementy:

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

kod prawdopodobnie pozostanie tak:

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 

widzę masz if commit: utrzymują się obiekt, więc starają się dostosować kod do korzystania z niego. Jeśli pierwsza wersja mojej odpowiedzi zadziałała, na końcu będziesz w porządku z s.save(), jeśli druga to ta, która działała, musisz trochę skorygować kod, aby zachować wartość commit.

Mam nadzieję, że to pomoże!

+0

To było to. Dzięki! – tlovett1

+1

Mam podobny problem, jak również. Twoja wskazówka uczyniła mój dzień! Komunikat o błędzie jest dla mnie tak mylący ... "" "musi mieć wartość dla pola" surveythread ", zanim będzie można użyć relacji wielu do wielu." Pole 'survereadread' w rzeczywistości oznacza pole w tabeli "parent_survey". – stanleyxu2005

Powiązane problemy