Reputation: 548
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:
When I click create new with pk, I am passing pk of School and I go to:
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
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