如何将值从数据库导入到 OptionMenu Django Python

How to import values from database into a OptionMenu Django Python

我这里有一个模型页面。

 from django.db import models

class Trainee(models.Model):
TraineeID = models.AutoField(primary_key=True)
Name = models.CharField(max_length=50)
Course = models.CharField(max_length=20)
BatchNo = models.CharField(max_length=15)
DateofBirth = models.CharField(max_length=30)
ContactNo = models.CharField(max_length=20)
ContactAddress = models.CharField(max_length=80)
EmailAddress = models.EmailField()
class Meta():
    db_table = "Trainee"

class Course(models.Model):
CourseID = models.AutoField(primary_key=True)
CourseName = models.CharField(max_length=20)
CourseDuration = models.CharField(max_length=30)
CourseCost = models.CharField(max_length=50)
class Meta():
    db_table = "Courses"

我制作了一个 html 页面,我可以在其中输入数据并保存 Trainee。我想让 Course 成为一个 OptionMenu 而不是一个 charfield,它将仅从 Courses table 中保存的数据中获得选项 <select>。因此,如果 Courses table 中有保存的数据,如 -Java、Python、C 等,那么选项菜单 Course 将只有这些。如果删除它们或添加新的,则选项菜单将相应更改。这是我的 html 页面,我可以在其中输入数据并保存:

{% extends "MyTestApp/base.html" %}
{% block body_block %}
{% load static %}                  
<link rel="stylesheet" href="{% static '/css/bootstrap.min.css'%}" />
<form method="post" action="/trainee/">
{%csrf_token%}

    <div class="container">

        <br/>

        <div class="form-group row">
            <label class="col-sm-1 col-form-label"></label>
            <div class="col-sm-4">
                <h3> Enter Trainee Information </h3>
            </div>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label"> Name: </label>
            <div class="col-sm-4">
                {{form.Name}}
            </div>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label" for="Course"> Course: </label>
            <div class="col-sm-4">
                    <select name="Course" id="Course">
                        
                            <option value="{{courses.CourseName}}">{{courses.CourseName}}</option>
                        
                    </select>

            </div>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label"> BatchNo: </label>
            <div class="col-sm-4">
                {{form.BatchNo}}
            </div>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label" for="DateofBirth"> Date Of Birth: </label>
            <div class="col-sm-4">
                <input type="date" name="DateofBirth" id="DateofBirth">
            </div>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label"> ContactNo: </label>
            <div class="col-sm-4">
                {{form.ContactNo}}
            </div>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label"> ContactAddress: </label>
            <div class="col-sm-4">
                {{form.ContactAddress}}
            </div>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label"> EmailAddress: </label>
            <div class="col-sm-4">
                {{form.EmailAddress}}
            </div>
        </div>

        <div class="form-group row">
            <label class="col-sm-2 col-form-label"></label>
            <div class="col-sm-4">
                <button type="submit" class="btn btn-primary"> Submit </button>
            </div>

        </div>
    </div>
</form>
{% endblock %}

我希望我已经说清楚了。任何帮助将不胜感激。在过去的一个月里,我一直被困在这个问题上。

如果我正确理解这里的问题,您正在寻找:

class Trainee(models.Model):
     ...
     course = models.ForeignKey('Course', on_delete=models.SET_NULL)
     ...

在此处阅读更多相关信息:Django's ForeignKey。 顺便提一句。如果你想遵循推荐的 PEP8 规则,相信我你想要,模型字段和变量应该是 snake_case(小写)。

您在 views.py 中的表单视图可能需要在其上下文中包含 courses = Course.objects.all(),具体取决于您在其中包含的内容。

views.py:

SomeView(AnyView):
    ...
    extra_context = {'courses': Course.objects.all()}
    ...

然后html表单模板:

...
<select name="course" id="id_course">

    {% for course in courses %}               
        <option value="{{ course.id }}">{{ course.course_name }}</option>
    {% endfor %}

</select>
...

通常传递 object.id 的值比 object.name 更好。名称应该为人类命名,ID 应该为我们的算法命名。