davidblak3
davidblak3

Reputation: 3

How can I pass a variable from one form to the next in Django 1.6

I am trying to assign the user value in my views.py from another form but I always seem to get the following error. Cannot assign "u'applematter'": "Student.user" must be a "User" instance. how can I get the hidden field user to match what I am writing in another field.

views.py File

from django.shortcuts import render
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from famu.forms import *
from django.contrib.auth.decorators import login_required




@login_required(login_url='')
def enroll(request):
    if request.method == 'POST':
        form = UserForm(request.POST,)
        form2 = StudentCreate(request.POST)
        if form.is_valid() and form2.is_valid():
            new_user = form.save(commit=False)
            new_student = form2.save(commit=False)
            new_student.user = (new_user.username)
            new_user.save()
            new_student.save()

            return HttpResponseRedirect('/')
    else:
        form = UserForm# An unbound form
        form2 = StudentCreate

    return render(request, 'famu/enroll.html', {
        'form': form,
        'form2': form2
    })

forms.py

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django import forms
from famu.models import Student



class UserForm(UserCreationForm):

    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email','username',)

class StudentCreate(forms.ModelForm):


    class Meta:
        model = Student
        exclude =['user',]

model.py

from django.db import models
from django.contrib.auth.models import User


class Student(models.Model):
    CLASSIFICATION = (
        ('FR', 'Freshman'),
        ('SO', 'Sophomore'),
        ('JR', 'Junior'),
        ('SR', 'Senior'),
        ('GR', 'Graduate'),
    )
    TERMS = (
        ('F', 'Fall'),
        ('S', 'Spring'),
        ('Su', 'Summer'),
    )
    MAJOR = (
        ('CS', 'Computer Science'),
        ('CY', 'Computer Systems'),
        ('IT', 'Information Technology'),
    )
    user = models.ForeignKey(User)
    student_id = models.IntegerField(primary_key=True, max_length=9)
    classification = models.CharField(max_length=2, choices=CLASSIFICATION)
    enrolled_year  = models.IntegerField(max_length=4)
    enrolled_term = models.CharField(max_length=2, choices=TERMS)
    major = models.CharField(max_length=2, choices=MAJOR)
    street_number = models.IntegerField(max_length=10)
    street_name = models.CharField(max_length=45)
    apt_number = models.CharField('apt #', max_length=10, blank=True, )
    city = models.CharField(max_length=30)
    state = models.CharField(max_length=2)
    zipcode = models.IntegerField('Zip Code', max_length=5, )
    last_modified = models.DateTimeField(auto_now=True)

Upvotes: 0

Views: 875

Answers (1)

Rohan
Rohan

Reputation: 53386

You should first save new_user instance and then assign it in new student instance.

Relevant code

@login_required(login_url='')
def enroll(request):
    if request.method == 'POST':
        form = UserForm(request.POST,)
        form2 = StudentCreate(request.POST)
        if form.is_valid() and form2.is_valid():
            new_user = form.save(commit=False)
            new_user.save() #form.save() should also work rather than this 2 statements

            new_student = form2.save(commit=False)
            new_student.user = new_user #assign user instance, not username

            new_student.save()

Upvotes: 1

Related Questions