Python 仅一个表单字段无法显示数据库中的值

Python 仅一个表单字段无法显示数据库中的值,python,django,Python,Django,我的模型: class DirectoryDoctors (models.Model): num = models.AutoField(primary_key=True) name = models.CharField(max_length=100) design_choices = ( ('IMO', 'IMO'), ('AIMO', 'AIMO'), ('Dental Surgeon', 'Dental Surgeon'

我的模型:

class DirectoryDoctors (models.Model):
    num = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    design_choices = (
        ('IMO', 'IMO'),
        ('AIMO', 'AIMO'),
        ('Dental Surgeon', 'Dental Surgeon'),
        ('Regional Deputy Director', 'Regional Deputy Director'),
        ('Joint Director', 'Joint Director'),
        ('Director', 'Director'),
        ('unspecified', 'Unspecified')
    )
    designation = models.CharField(
        choices=design_choices, max_length=30, default='unspecified')
    mobile = models.CharField(max_length=15, default='')
    alternate = models.CharField(max_length=15, default='', blank=True)
    email = models.CharField(max_length=50, default='', blank=True)
    dob = models.DateField(null=True, blank=True)
    specialiast_or_not_choices = (
        ('Yes', 'Yes'),
        ('No', 'No'),
        ('Unspecified', 'Unspecified')
    )
    specialiast = models.CharField(
        choices=specialiast_or_not_choices, max_length=30, default='Unspecified')
    specialty_choices = (
        ('Internal Medicine', 'Internal Medicine'),
        ('General Surgery', 'General Surgery'),
        ('ENT', 'ENT'),
        ('Ophthalmology', 'Ophthalmology'),
        ('Dermatology', 'Dermatology'),
        ('Paediatrics', 'Paediatrics'),
        ('Respiratory Medicine', 'Respiratory Medicine'),
        ('Psychiatry', 'Psychiatry'),
        ('Obstetrics and Gynaecology', 'Obstetrics and Gynaecology'),
        ('Physical Medicine', 'Physical Medicine'),
        ('Radiodiagnosis', 'Radiodiagnosis'),
        ('Anaesthesia', 'Anaesthesia'),
        ('Unspecified', 'Unspecified'),
        ('Not Applicable', 'Not Applicable')
    )
    specialty = models.CharField(
        choices=specialty_choices, max_length=30, default='Unspecified')
    institution = models.ForeignKey(DirectoryHospital, on_delete=models.DO_NOTHING)
    bloodgroup_choices = (('apos', 'A+'),
        ('A-', 'A-'),
        ('B+', 'B+'),
        ('B-', 'B-'),
        ('O+', 'O+'),
        ('O-', 'O-'),
        ('AB+', 'AB+'),
        ('AB-', 'AB-'),
        ('-', '-')
        )
    bloodgroup = models.CharField(choices=bloodgroup_choices, max_length=15, blank=True)
    spousename = models.CharField(max_length=100, blank=True)
    children = models.CharField(max_length=200, blank=True)
    present_address = models.CharField(max_length=200, blank=True)
    permanent_address = models.CharField(max_length=200, blank=True)

    class Meta:
        unique_together = ["name", "mobile", "email"]
我的表格:

class DirectoryDoctorsForm(ModelForm):
    class Meta:
        model = DirectoryDoctors
        fields = [
            'name',
            'designation',
            'mobile',
            'alternate',
            'email',
            'dob',
            'specialiast',
            'specialty',
            'institution',
            'bloodgroup',
            'spousename',
            'children',
            'present_address',
            'permanent_address'
            ]
        unique_together = ["name", "mobile", "email"]
我的看法是:

@login_required
def editdoctorprofile(request, person_id):
    person_id = int(person_id)
    doc = DirectoryDoctors.objects.get(num = person_id)
    msg =''
    if request.method == 'POST':
        print("POST details", request.POST)
        form = DirectoryDoctorsForm(request.POST)
        if form.is_valid():
            print("Form is valid.")
            username = request.POST.get('username')
        else:
            msg = "Invalid details."
            print(msg)
    else:
        form = DirectoryDoctorsForm(instance=doc)

    return render(
        request, 'app/editdoctor.html', {
            'rnd_num': randomnumber(),
            'doc': doc,
            'form': form                                                                
        }) 
app/editdoctor.html:

<form method="post">
{% csrf_token %}

<div class="row my-1">
    <div class="col-md-2 mb-6">
        <label for="name">Name</label>
    </div>
    <div class="col-md-18 mb-6">
        {{ form.name|add_class:"form-control" }}
    </div>
</div>

<div class="row my-1">
    <div class="col-md-2 mb-6">
        <label for="designation">Designation</label>
    </div>
    <div class="col-md-18 mb-6">
        {{ form.designation|add_class:"form-control" }}
    </div>
</div>

<div class="row my-1">
    <div class="col-md-2 mb-6">
        <label for="mobile">Mobile</label>
    </div>
    <div class="col-md-18 mb-6">
        {{ form.mobile|add_class:"form-control" }}
    </div>
</div>

<div class="row my-1">
    <div class="col-md-2 mb-6">
        <label for="designation">Alternate</label>
    </div>
    <div class="col-md-18 mb-6">
        {{ form.alternate|add_class:"form-control" }}
    </div>
</div>

<div class="row my-1">
    <div class="col-md-5 mb-6">
        <label for="specialiast">Are you a Specialiast?</label>
    </div>
    <div class="col-md-15 mb-6">
        {{ form.specialiast|add_class:"form-control" }}
    </div>
</div>

<div class="row my-1">
    <div class="col-md-6 mb-6">
        <label for="specialty">If yes, what is your Specialty?</label>
    </div>
    <div class="col-md-14 mb-6">
        {{ form.specialty|add_class:"form-control" }}
    </div>
</div>
<div class="row my-1">
    <div class="col-md-2 mb-6">
        <label for="institution">Station</label>
    </div>
    <div class="col-md-18 mb-6">
        {{ form.institution|add_class:"form-control" }}
    </div>
</div>
<div class="row my-1">
    <div class="col-md-3 mb-6">
        <label for="bloodgroup">Blood Group</label>
    </div>
    <div class="col-md-17 mb-6">
        {{ form.bloodgroup|add_class:"form-control" }}
    </div>
</div>
<div class="row my-1">
    <div class="col-md-5 mb-6">
        <label for="spousename">Name of your spouse</label>
    </div>
    <div class="col-md-15 mb-6">
        {{ form.spousename|add_class:"form-control" }}
    </div>
</div>
<div class="row my-1">
    <div class="col-md-5 mb-6">
        <label for="children">Name of your children</label>
    </div>
    <div class="col-md-15 mb-6">
        {{ form.children|add_class:"form-control" }}
    </div>
</div>
<div class="row my-1">
    <div class="col-md-4 mb-6">
        <label for="present_address">Present Address</label>
    </div>
    <div class="col-md-16 mb-6">
        {{ form.present_address|add_class:"form-control" }}
    </div>
</div>
<div class="row my-1">
    <div class="col-md-4 mb-6">
        <label for="permanent_address">Permanent Address</label>
    </div>
    <div class="col-md-16 mb-6">
        {{ form.permanent_address|add_class:"form-control" }}
    </div>
</div>
<div class="row">
    <div class="col-md-4 mb-1">
        <button class="btn btn-primary btn-block" id="add_doctor" type="submit">Save changes</button>
    </div>
</div>

{%csrf_令牌%}
名称
{form.name | add_类:“form control”}
任命
{{form.designation}添加_类:“form control”}
可移动的
{form.mobile | add_类:“form control”}
候补
{{form.alternate}添加_类:“form control”}
你是专家吗?
{{form.specialist}添加_类:“表单控件”}
如果是,你的专长是什么?
{{form.speciality}添加_类:“form control”}
站
{{form.institution}添加_类:“表单控制”}
血型
{{form.bloodgroup}添加_类:“form control”}
配偶姓名
{form.spoosename | add_类:“form control”}
你孩子的名字
{form.children | add_类:“form control”}
当前地址
{{form.present|add|class:“form control”}
永久地址
{{form.permanent_address}添加_类:“form control”}
保存更改
显示此页面时,例如,对于pk为175的queryset get,表单字段bloodgroup单独显示不正确。它显示值“----”

但如果在django shell上,我会:

>>> from app.models import DirectoryDoctors,DirectoryHospital
>>> DirectoryDoctors.objects.get(pk=175)
<DirectoryDoctors: Mike Dewey, Deputy Director, Deputy Directorate Angamaly, Angamaly>
>>> DirectoryDoctors.objects.get(pk=175).bloodgroup
'A+'
>>> 
>>从app.models导入DirectoryDoctors,DirectoryHospital
>>>DirectoryDoctors.objects.get(pk=175)
>>>DirectoryDoctors.objects.get(pk=175).bloodgroup
“A+”
>>> 

为什么仅此字段未正确显示?

该字段的值似乎无效

您将字段
bloodgroup
的第一个选项定义为:

bloodgroup_choices = (
    ('apos', 'A+'),
    ...
)
但在打印值时,它会显示
A+
(如您所示):

但是它必须是
apos
,小部件才能在HTML表单中识别它


如果使用数据尝试此方法调用,则此方法调用应突出显示问题:

>>> DirectoryDoctors.objects.get(pk=175).get_bloodgroup_display()

更可能的是,OP应该更新
apos
选项,因为所有其他选项都与显示值相同。@DanielRoseman是的,你是对的,这对代码库的未来可维护性可能更好……我想提到的一件事是,
form=DirectoryDoctorsForm(request.POST)
form.save()
将创建新实例,而不是编辑现有实例。要更新现有实例,您需要通过类似
form=DirectoryDoctorsForm(request.POST,instance=doc)
>>> DirectoryDoctors.objects.get(pk=175).get_bloodgroup_display()