首页 > 解决方案 > 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() 用于其中一个问卷问题。

如果有人对为什么会这样有任何建议,那将是惊人的!

标签: pythondjango

解决方案


那是因为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/


推荐阅读