2013-07-06 16 views
40

Khi lưu biểu mẫu tôi gặp phải lỗi này: "" cần phải có giá trị cho trường " khảo sát "trước khi mối quan hệ nhiều-nhiều này có thể được sử dụng.Lỗi Django: cần có giá trị cho trường "..." trước mối quan hệ nhiều-nhiều này có thể được sử dụng

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 

Thông báo lỗi:

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 

Tôi mới dùng Django và Python. Tôi có thể đăng các dấu vết gỡ lỗi hoặc di chuyển tập tin nếu cần thiết, nhưng tôi có một cảm giác đó là một sửa chữa đơn giản. Rõ ràng là tôi muốn lưu nhiều chuỗi khảo sát cho mỗi kết quả khảo sát.

Cảm ơn!

+0

Thực ra, thông báo lỗi chính xác và truy nguyên sẽ rất hữu ích để chúng tôi cung cấp cho bạn và trả lời. –

+0

Tôi đã thêm thông báo lỗi đầy đủ và truy nguyên về chuỗi ban đầu. – tlovett1

Trả lời

3

Trong phần này của mã trong forms.py, bạn đang đặt trường survey trên đối tượng SurveyThread để None, tuy nhiên nó không được phép None theo models.py của bạn:

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 

Bạn phải thiết lập survey đối tượng SurveyResult trước khi bạn có thể lưu hoặc cho phép nó là None trong mô hình.

Tôi nghĩ rằng bạn muốn thay đổi nó để nói:

s.survey = self.survey 
+0

Rất tiếc. Tôi xin lôi. Tôi vẫn gặp lỗi với s.survey = self.survey. Tôi đã thay đổi nó thành Không khi tôi đang gỡ lỗi và quên thay đổi lại. Tôi đã cập nhật bài đăng gốc của mình để phản ánh điều này. – tlovett1

40

Ok, mã là hơi lộn xộn, tôi chắc chắn bạn sẽ được tốt hơn off tackling your problem with ModelForms. Dường như với tôi vấn đề thực sự là dòng:

s.survey = self.survey 

s đối tượng chưa được ghi vào cơ sở dữ liệu, vì vậy việc tiếp cận nó survey lĩnh vực ManyToMany có thể mang lại vấn đề. Nếu bạn muốn sao chép cùng một bộ khảo sát self-s bạn nên làm điều đó lặp qua chúng như thế này:

Nếu đây mang lại những lỗi tương tự, sau đó cố gắng làm s.save() đầu tiên và sau đó sao chép các mục:

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

mã của bạn có khả năng duy trì như thế này:

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 

tôi có thể thấy bạn có một if commit: để tồn tại đối tượng, vì vậy hãy thử để thích ứng với mã để tận dụng nó. Nếu phiên bản đầu tiên của câu trả lời của tôi hoạt động thì bạn sẽ ổn với số s.save() ở cuối, nếu thứ hai là người làm việc, thì bạn sẽ phải điều chỉnh mã một chút để gắn vào giá trị commit.

Hy vọng điều này sẽ hữu ích!

+0

Đây là nó. Cảm ơn! – tlovett1

+1

Tôi cũng gặp vấn đề tương tự. Gợi ý của bạn làm cho ngày của tôi! Thông báo lỗi rất khó hiểu đối với tôi ... '" "cần có một giá trị cho trường" surveythread "trước khi mối quan hệ nhiều-nhiều này có thể được sử dụng.' Trường 'surveythread' thực sự có nghĩa là một trường trong bảng 'parent_survey'. – stanleyxu2005

Các vấn đề liên quan