gpt4 book ai didi

python - Django 错误 : needs to have a value for field "..." before this many-to-many relationship can be used

转载 作者:IT老高 更新时间:2023-10-28 20:34:32 26 4
gpt4 key购买 nike

保存表单时出现此错误:""需要为字段 "surveythread"设置一个值,然后才能使用这种多对多关系。

模型.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 的新手。如果需要,我可以发布调试跟踪或迁移文件,但我觉得这是一个简单的修复。显然重点是我想为每个调查结果保存多个调查线程。

谢谢!

最佳答案

好的,代码有点乱,我相信你会更好tackling your problem with ModelForms .在我看来问题实际上是行:

s.survey = self.survey

因为 s 对象尚未写入数据库,因此访问它的 survey ManyToMany 字段可能会产生问题。如果您想将同一组调查从 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 = "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

我可以看到您有一个 if commit: 来持久化对象,因此请尝试容纳代码以使用它。如果我的答案的第一个版本有效,那么您最后可以使用 s.save() ,如果第二个版本是有效的,那么您将不得不调整代码有点坚持 commit 值。

希望这会有所帮助!

关于python - Django 错误 : needs to have a value for field "..." before this many-to-many relationship can be used,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17505935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com