简体   繁体   中英

Django Model Not Saving All Data From Form

I currently have a Django form that saves data from a questionnaire against a user, where a user is stored as a Foreign Key from the Person model. I can successfully find the person from the Person class using get_object_or_404(), but when I try to save(commit=True), the data is not being saved in the database. See below for my code:

# 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(),
        }

So at the moment I'm drawing the user parameter from the URL, which is uuid.uuid4(). The print statement in the "try: except" bit successfully prints out the user UUID as expected, yet when submitted it doesn't save correctly. For further info, I am using the MultiSelectField() for one of the questionnaire questions.

If anyone has any suggestions as to why this might be, that would be amazing!

That is because asnwers.save(commit=False) creates another new object.

Do something like

f = answer.save(commit=false) 
f.person = get_object_or_404(Person, referral_code=user_referral_id) 
f.save() 

No need to do f.save(commit=True) since the True is default.

for more info check docs: docs.djangoproject.com/en/3.1/topics/forms/modelforms/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM