Populate fields that aren't in a Django ModelForm

I ran across an issue today that, in hindsight, was simple and probably a result of not reading the Django documentation thoroughly enough. I'm definitely still in the "learning" phase of my relationship with Django.

Consider this (imperfect) example: you're using a ModelForm to allow users of your web app to create a Student. The user would supply the student's name, date of birth, and address in a form, but the student ID should be generated based on their other information (e.g. name and date of birth).

The ModelForm object won't give you access to the underlying Model's student_id field unless you include it with the form, which is undesirable. You could also save the Student to the database, then update its student_id field, but that's pretty inefficient. The better solution:

# Model
class Student(models.Model):
    student_id = models.CharField()
    name = models.CharField()
    dob = models.DateField()
    address = models.CharField()
    

# ModelForm
class AddStudentForm(forms.ModelForm):
    class Meta:
        model = Student
        # don't include student_id
        fields = ['name', 'birthday', 'address']
        

# View
def add_student(request):
    ...
    if form.is_valid():
        # this will gave you an instance of the Student model without saving it to the db
        student = form.save(commit=False)
        
        # then you can create the student_id and save to the db
        student.student_id = create_id(student.name, student.dob)
        student.save()
    ....
Show Comments