unnobtainium
unnobtainium

Reputation: 548

How to autofill variable with foreign key in django form?

In short: I want to autofill form's foreign variable:

TL;DR
Here is project link. I have a model:

from django.db import models
from django.urls import reverse
# Create your models here.

class School(models.Model):
    name = models.CharField(max_length=256)
    principal = models.CharField(max_length=256)
    location = models.CharField(max_length=256)

    def __str__(self): return self.name

    def get_absolute_url(self):
        return reverse('basic:detail', kwargs={'pk': self.pk})

class Student(models.Model):
    name = models.CharField(max_length=256)
    age = models.PositiveIntegerField()
    school = models.ForeignKey(School, on_delete=models.CASCADE, related_name='students')

    def __str__(self): return self.name

    def get_absolute_url(self):
        return reverse('basic:detail', kwargs={'pk': self.school.pk})

and url.py:

urlpatterns = [
    path('', views.Index.as_view(), name='index'),
    path('list/', views.SchoolListView.as_view(), name='list'),
    path('<int:pk>/', views.SchoolDetailView.as_view(), name='detail'),
    path('create/', views.SchoolCreateView.as_view(), name='create'),
    path('update/<int:pk>/', views.SchoolUpdateView.as_view(), name='update'),
    path('delete/<int:pk>/', views.SchoolDeleteView.as_view(), name='delete'),

    path('student/create/', views.StudentCreateView.as_view(), name='creates'),
    path('student/create/<int:pk>', views.StudentCreateView.as_view(), name='createspk'),
    path('student/update/<int:pk>/', views.StudentUpdateView.as_view(), name='updates'),
    path('student/delete/<int:pk>/', views.StudentDeleteView.as_view(), name='deletes'),


]

and i am using CBV:

class StudentCreateView(CreateView):
    try:
        print("*******")
        print(pk)
    except:
        pass
    model = Student
    fields = ["name", "age", 'school']

I added a link to create student in school detail as shown below: screenshot

When I click create new with pk, I am passing pk of School and I go to: scrreenshot2

As you can see School field is dropdown with nothing selected, I would like to make that the school default value to be the school from where it is called, in this case xavier school for gifted childrens.

My create student code is:

{% extends "basic/base.html" %}

{% block content %}
<h1>
    {% if not form.instance.pk %}
    Create Student:
    {% else %}
    Update Student:
    {% endif %}
</h1>
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" class="btn btn-primary">
</form>
{% endblock content %}

How can I do that? Thanks in advance.

Upvotes: 2

Views: 2154

Answers (1)

Tim
Tim

Reputation: 1357

Try modifying your view like so:

class StudentCreateView(CreateView):
    try:
        print("*******")
        print(pk)
    except:
        pass
    model = Student
    fields = ["name", "age", 'school']

    def get_initial(self):
        initial = super(StudentCreateView, self).get_initial()
        initial['school'] = School.objects.get(pk=self.kwargs['pk'])
        return initial

I would additionally recommend to rename the parameter in the url (and then also in the get_initial method) to something like school_pk to make it clear you do not pass a pk for the Student to be created.

Upvotes: 1

Related Questions