Django UpdateView和ChoiceField问题。Django 1.11 python 3.6

Django UpdateView和ChoiceField问题。Django 1.11 python 3.6,django,django-models,django-forms,django-class-based-views,django-1.11,Django,Django Models,Django Forms,Django Class Based Views,Django 1.11,在django中实现ChoiceField和UpdateView时,我面临一个奇怪的问题。我制作了一个小剪辑,展示了我面临的问题。请在启用字幕/cc的情况下观看。这将使我对我面临的问题有一个了解。问题是这样的 在CreateView期间,我将“性别”选项字段设置为“女性”。但在UpdateView中,它将“性别”选项字段预先填充为男性 但是,列表视图将“性别”字段正确地呈现为“女性” 奇怪的是,django管理面板根本没有显示“性别”字段的值 以下是所有代码: models.py: from d

在django中实现ChoiceField和UpdateView时,我面临一个奇怪的问题。我制作了一个小剪辑,展示了我面临的问题。请在启用字幕/cc的情况下观看。这将使我对我面临的问题有一个了解。问题是这样的

CreateView
期间,我将“性别”选项字段设置为“女性”。但在
UpdateView
中,它将“性别”选项字段预先填充为男性

但是,
列表视图
将“性别”字段正确地呈现为“女性”

奇怪的是,django管理面板根本没有显示“性别”字段的值

以下是所有代码:

models.py:

from django.db import models
from django.core.urlresolvers import reverse

gender_choices = (('Male', 'Male'), ('Female', 'Female'))

class Birth(models.Model):
    full_name = models.CharField(max_length = 100)    
    gender = models.CharField(max_length=6, choices=gender_choices)
    date_of_birth = models.DateField()
    place_of_birth = models.CharField(max_length = 50)
    mother_name = models.CharField(max_length = 50)
    father_name = models.CharField(max_length = 50)
    address_at_time_of_birth = models.TextField(max_length = 500)
    permanent_address = models.TextField(max_length = 500)
    registration_no = models.CharField(max_length = 50)
    remarks = models.CharField(max_length = 200)    
    registration_date = models.DateField()
    issue_date = models.DateField()

    def get_absolute_url(self):
        return reverse('birth:birth_update', kwargs={'pk':self.pk})
        #return reverse('birth:birth_home')

    def __str__(self):
        return self.full_name
forms.py:

from django import forms
from .models import *    

class BirthForm(forms.ModelForm):
        full_name = forms.CharField()
        gender = forms.ChoiceField(choices = gender_choices, widget=forms.Select())
        date_of_birth = forms.DateField(widget = forms.DateInput(attrs = {'placeholder':'DD/MM/YYYY'}))
        place_of_birth = forms.CharField()
        mother_name = forms.CharField()
        father_name = forms.CharField()
        address_at_time_of_birth = forms.CharField(widget = forms.Textarea())
        permanent_address = forms.CharField(widget = forms.Textarea())
        registration_no = forms.CharField(required = False)
        registration_date = forms.DateField(required = False, widget = forms.DateInput(attrs = {'placeholder':'DD/MM/YYYY'}))
        remarks = forms.CharField(required = False)
        issue_date = forms.DateField(required = False, widget = forms.DateInput(attrs = {'placeholder':'DD/MM/YYYY'}))


        class Meta:
            model = Birth
            fields = '__all__'
views.py:

from django.views.generic import ListView, CreateView, UpdateView
from .models import *
from .forms import *
from datetime import date


class BirthHome(ListView):
    template_name = 'birth/birth_home.html'
    model = Birth
    context_object_name = 'birth_objects'
    paginate_by = 20

    def get_queryset(self):
        return Birth.objects.all().order_by('-id')


class NewBirth(CreateView):
    model = Birth
    form_class = BirthForm
    #fields = '__all__' 
    template_name = 'birth/birth_add.html'


    def form_valid(self, form):
        obj = form.save(commit = False)
        if not obj.registration_date:
            obj.registration_date = date.today()
        if not obj.issue_date:
            obj.issue_date = date.today()
        if not (date(1900, 1, 1) <= obj.date_of_birth <= date.today()):
            form.add_error('date_of_birth', 'Please enter a valid date')
            return super(NewBirth, self).form_invalid(form)
        obj.full_name = obj.full_name.upper()
        obj.gender = obj.gender.upper()
        obj.place_of_birth = obj.place_of_birth.upper()
        obj.mother_name = obj.mother_name.upper()
        obj.father_name = obj.father_name.upper()
        obj.address_at_time_of_birth = obj.address_at_time_of_birth.upper()
        obj.permanent_address = obj.permanent_address.upper()
        if obj.remarks:
            obj.remarks = obj.remarks.upper()
        self.object = form.save()
        return super(NewBirth, self).form_valid(form)


class BirthUpdate(UpdateView):
    model = Birth
    form_class = BirthForm
    template_name = 'birth/birth_update.html'

    def form_valid(self, form):
        obj = form.save(commit = False)
        if not obj.registration_date:
            obj.registration_date = date.today()
        if not obj.issue_date:
            obj.issue_date = date.today()
        if not (date(1900, 1, 1) <= obj.date_of_birth <= date.today()):
            form.add_error('date_of_birth', 'Please enter a valid date')
            return super(BirthUpdate, self).form_invalid(form)
        obj.full_name = obj.full_name.upper()
        obj.gender = obj.gender.upper()
        obj.place_of_birth = obj.place_of_birth.upper()
        obj.mother_name = obj.mother_name.upper()
        obj.father_name = obj.father_name.upper()
        obj.address_at_time_of_birth = obj.address_at_time_of_birth.upper()
        obj.permanent_address = obj.permanent_address.upper()
        if obj.remarks:
            obj.remarks = obj.remarks.upper()
        self.object = form.save()
        return super(BirthUpdate, self).form_valid(form)
来自django.views.generic import ListView、CreateView、UpdateView
从。模型导入*
从。表格导入*
起始日期时间导入日期
类BirthHome(列表视图):
模板名称='birth/birth\u home.html'
模型=出生
上下文\u对象\u名称='出生\u对象'
分页单位=20
def get_queryset(自我):
返回Birth.objects.all()
类NewBirth(CreateView):
模型=出生
形态=出生形态
#字段='\uuuu所有\uuuu'
模板名称='birth/birth\u add.html'
def表单_有效(自身、表单):
obj=form.save(commit=False)
如果不是目标注册日期:
obj.registration_date=date.today()
如果不是目标发布日期:
obj.issue_date=date.today()

如果没有(日期(1900年1月1日)已解决!

所以经过大量的实验,我意识到了问题所在!!它在models.py文件中:

由于我将所有输入转换为大写,因此“choices”元组的值也需要大写

gender_choices = (('Male', 'Male'), ('Female', 'Female'))
在我看来,我将性别设置为大写,从而导致声明的元组数据和表单数据不匹配

因此,我将元组更改为:

gender_choices = (('MALE', 'MALE'), ('FEMALE', 'FEMALE'))

很有魅力!!干杯…谢谢所有的帮助和建议。欢迎任何反馈:)

已解决

所以经过大量的实验,我意识到了问题所在!!它位于models.py文件中:

因为我将所有输入转换为大写,所以“choices”元组的值也需要大写。最初,性别选择元组如下所示:

gender_choices = (('Male', 'Male'), ('Female', 'Female'))
在我看来,我将性别设置为大写,从而导致声明的元组数据和表单数据不匹配

因此,我将元组更改为:

gender_choices = (('MALE', 'MALE'), ('FEMALE', 'FEMALE'))

很有魅力!!干杯谢谢你的帮助和建议。欢迎任何反馈:)

删除此行
obj.gender=obj.gender.upper()
并重试。删除此行
obj.gender=obj.gender.upper()
并重试。