How to have pre/post populated id field in django form submission

Viewed 45

What I am trying to achieve is to have my "student_id" auto-generated field to be part of the form submission in the sense that the "student_id" field does not have to be manually input in form submission:

The "student_id" field needs to be either pre-generated upon displaying the form or to be generated upon form submission.

I have tried and currently facing error when submitting form as bellow:

KeyError at 'student_id'

Exception Value: 'student_id'

Removing the "student_id = form.cleaned_data['student_id']" syntax in views.py does not help either.

I have the following model, which generates an auto "student_id" field

class Student(models.Model):
student_id = models.AutoField(primary_key=True,unique=True, max_length=10, blank=False)
name = models.CharField(max_length=200, blank=False)
first_name = models.CharField(max_length=100, blank=True)
last_name = models.CharField(max_length=100, blank=True)

def __str__(self):
    return self.name

my forms.py:

    Class StudentForm(forms.ModelForm):
        class Meta:
            model = Student
            fields = [
                'student_id','name', 'first_name', 'last_name'
            ]

my views.py:

    def index(request):
        if request.method == 'POST':
            form = StudentForm(request.POST, or None)
            if form.is_valid():
                student_id = form.cleaned_data['student_id']
                form.save()
            else:
                FormError = StudentForm.errors
            
            return redirect(f'/card/{student_id}')
        else:
            form = StudentForm()
    
        template_name = 'index.html'
        context = {
            'form' : form,
        }
        return render(request, template_name, context)

my html:

<form method="POST" action="{% url 'student:index' %}" enctype="multipart/form-data">{% csrf_token %}

            <div class="form-group">
                {{ form | crispy }}
            </div>
    <input type="submit" value="Envoyer" class="btn btn-primary btn-lg btn-block">
    </form>

Will appreciate any help

0 Answers
Related