Django错误:需要为字段“ ...”添加一个值在可以使用这种多对多关系之前 [英] Django error: needs to have a value for field "..." before this many-to-many relationship can be used

查看:75
本文介绍了Django错误:需要为字段“ ...”添加一个值在可以使用这种多对多关系之前的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

保存表单时出现此错误:
必须具有字段 surveythread的值,然后才能使用这种多对多关系。

When saving a form I am getting this error: "" needs to have a value for field "surveythread" before this many-to-many relationship can be used.

Models.py:

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 = "test@test.com"
        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的新手。我可以根据需要发布调试跟踪或迁移文件,但我觉得这很简单。显然,我想为每个调查结果保存多个调查线程。

I'm new to Django and Python. I can post the debug trace or migration file if needed, but I have a feeling it's a simple fix. Obviously the point is I want to save multiple survey thread for each survey result.

谢谢!

推荐答案

好吧,代码有点混乱,我相信您最好使用 ModelForms 解决您的问题。在我看来,问题实际上是这条线:

Ok, the code is slightly messy, I'm sure you'll be better off tackling your problem with ModelForms. Seems to me the problem actually is the line:

s.survey = self.survey

因为 s 对象尚未写入数据库,因此访问它是调查 ManyToMany字段可能会产生问题。如果要将同一组调查从自身复制到 s ,则应像这样对它们进行迭代:

because s object hasn't been written to the database yet, so accessing it's survey ManyToMany field can yield problems. If you want to copy the same set of surveys from self to s you should do it iterating over them like this:

如果产生相同的错误,则尝试先执行 s.save(),然后再复制项目:

If this yields the same error, then try to do s.save() first and later copy the items:

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

您的代码可能仍然像这样:

Your code is likely to remain like this:

def save(self, commit=True):
    s = SurveyThread()
    # these fields aren't problematic
    s.email = "test@test.com"
    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

我可以看到您有一个提交:以保留该对象,因此请尝试容纳代码以使用它。如果我的答案的第一个版本有效,那么您可以在最后加上 s.save(),如果第二个是有效的,那么您我将不得不稍微调整代码以使其符合 commit 的值。

I can see you have a if commit: to persist the object, so try to accommodate the code to make use of it. If the first version of my answer worked then you'll be fine with the s.save() at the end, if the second is the one who worked, then you'll have to adjust the code a little to stick to the commit value.

希望这会有所帮助!

这篇关于Django错误:需要为字段“ ...”添加一个值在可以使用这种多对多关系之前的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆