代码之家  ›  专栏  ›  技术社区  ›  unnobtainium

如何在django窗体中使用外键自动填充变量?

  •  1
  • unnobtainium  · 技术社区  · 7 年前

    简而言之:我想自动填充窗体的外部变量:

    tl;dr
    这里是project link。 我有一个模型:

    从django.db导入模型 从django.urls导入反向 #在这里创建模型。 班级学校(模特、模特): 名称=models.charfield(最大长度=256)

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

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

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

    screenshot

    scrreenshot2

    {% 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 回复  |  直到 7 年前
        1
  •  1
  •   Tim    7 年前

    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
    

    get_initial school_pk pk 对于 Student 创造。