Как автоматически заполнить переменную с помощью внешнего ключа в форме Django? - PullRequest
0 голосов
/ 28 августа 2018

Вкратце: я хочу автоматически заполнить внешнюю переменную формы:

TL; DR
Вот проект ссылка . У меня есть модель:

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})

и 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'),


]

и я использую CBV:

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

Я добавил ссылку, чтобы создать детали школьника, как показано ниже: screenshot

Когда я нажимаю «Создать новый с помощью pk», я передаю «pk of School» и перехожу к: scrreenshot2

Как видите, поле «Школа» выпадающее, и ничего не выбрано. Я хотел бы сделать так, чтобы значением по умолчанию для школы была школа, из которой оно называется, в данном случае xavier school для одаренных детей .

Мой код создания студента:

{% 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 %}

Как я могу это сделать? Заранее спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

Попробуйте изменить вид так:

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

Я бы дополнительно порекомендовал переименовать параметр в url (а затем и в методе get_initial) во что-то вроде school_pk, чтобы было ясно, что вы не передаете pk для Student, чтобы быть создано.

...