python - Django 模型不保存表单中的所有数据
问题描述
我目前有一个 Django 表单,用于保存针对用户的调查问卷中的数据,其中用户存储为来自 Person 模型的外键。我可以使用 get_object_or_404() 从 Person 类中成功找到该人,但是当我尝试保存(commit=True)时,数据没有保存在数据库中。请参阅下面的代码:
# models.py
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=100)
email = models.EmailField(max_length=254, primary_key=True)
tel_number = models.CharField(max_length=13, blank=True)
referral_code = models.UUIDField()
class Meta:
verbose_name_plural = 'People'
def __str__(self):
return str(self.referral_code)
class Questionnaire(models.Model):
user = models.ForeignKey(Person, related_name='questionnaire_person', on_delete=models.CASCADE)
... and some questionnaire questions here (CharFields and TextFields) ...
# views.py
def index_questionnaire(request):
template = 'questionnaire.html'
# load blank instance of template
questionnaire = UserQuestionnaire()
context = {
"questionnaire": questionnaire
}
# if user has submitted something, check form is valid
if request.method == 'POST':
answers = UserQuestionnaire(data=request.POST)
if answers.is_valid():
# submission is genuine so save as new entry to database
# get user's unique referral ID from URL
user_referral_id = request.GET.get('user')
# check legit person
try:
answers.save(commit=False)
answers.person = get_object_or_404(Person, referral_code=user_referral_id)
print('user found: {}'.format(answers.person))
answers.save(commit=True)
print('Questionnaire saved')
except:
print("user not found")
return render(
request,
template,
context
)
#forms.py
class UserQuestionnaire(forms.ModelForm):
class Meta:
model = Questionnaire
fields = (
'answers_1',
'free_text_1',
'answers_2',
'answers_3',
'answers_4',
'answers_5',
'answers_6'
)
widgets = {
'answers_2' : forms.RadioSelect(),
'answers_3' : forms.RadioSelect(),
'answers_4' : forms.RadioSelect(),
'answers_5' : forms.RadioSelect(),
}
所以目前我正在从 URL 中提取用户参数,即 uuid.uuid4()。“try:except”位中的打印语句按预期成功打印出用户 UUID,但提交时无法正确保存。有关更多信息,我将 MultiSelectField() 用于其中一个问卷问题。
如果有人对为什么会这样有任何建议,那将是惊人的!
解决方案
那是因为asnwers.save(commit=False)
创建了另一个新对象。
做类似的事情
f = answer.save(commit=false)
f.person = get_object_or_404(Person, referral_code=user_referral_id)
f.save()
无需这样做,f.save(commit=True)
因为它True
是默认值。
有关更多信息,请查看文档: docs.djangoproject.com/en/3.1/topics/forms/modelforms/
推荐阅读
- android - 如何更改工具栏三点菜单可绘制颜色或色调?
- java - 是否可以从 Singleton 类访问 RequestScoped 类?
- drools - 我们可以在 Drools 中实现离散窗口规则吗?
- linux - 协调 Kaldi 配方的链接和路径文件
- java - 如何使用Java(用于硒自动化)获取段落标签内的文本。(div/div/p)
- c# - WCF SwaggerWCF 实现
- java - Android Studio 无法找到或加载“Scratch”文件的主类
- kubernetes - clusterIP 可以从其他节点访问吗?
- php - Centos 7 php 狂热
- animation - 单击矩形时使用 svg 动画降低矩形的不透明度