Django在现有数据库的Y/N字符串字段上形成CheckboxInput

Django在现有数据库的Y/N字符串字段上形成CheckboxInput,django,forms,django-forms,modelform,Django,Forms,Django Forms,Modelform,我对Django比较陌生,我正在制作一个表单,连接到现有的MySQL数据库 我想做的是为国家创建一个维护页面。我数据库中的一个字段是eu_成员国 我在这里试图做的是为这个领域创建一个复选框,这样我就可以取消对最近脱离欧盟的英国的复选框 class CountryForm(forms.ModelForm): class Meta(): model = Countries fields = '__all__' widgets = {

我对Django比较陌生,我正在制作一个表单,连接到现有的MySQL数据库

我想做的是为国家创建一个维护页面。我数据库中的一个字段是eu_成员国

我在这里试图做的是为这个领域创建一个复选框,这样我就可以取消对最近脱离欧盟的英国的复选框

class CountryForm(forms.ModelForm):
    class Meta():
        model = Countries
        fields = '__all__'

        widgets = {
            'eu_member_state': forms.CheckboxInput()
        }
该复选框确实出现在我的表单上,但我如何才能使其与我的数据库对话?如何仅当数据库值为“Y”时才选中此复选框,如何在保存时将其写回数据库,因此选中时为“Y”,取消选中时为“N”

这是型号代码:

from django.db import models

class Countries(models.Model):
    country = models.CharField(unique=True, max_length=3)
    descr = models.CharField(max_length=50, blank=True, null=True)
    descrshort = models.CharField(max_length=20, blank=True, null=True)
    country_2char = models.CharField(max_length=2, blank=True, null=True)
    eu_member_state = models.CharField(max_length=1, blank=False, null=False, default='N')

    class Meta:
        db_table = 'countries'
        verbose_name_plural = "countries"

    def __str__(self):
        return self.descr

我通过创建一个自定义CheckboxInput字段并在forms.py中初始化来解决这个问题

class CountryForm(forms.ModelForm):

    eu_member_state_flag = forms.BooleanField(required=False,label='EU member state')

    class Meta():
        model = Countries
        exclude = ('eu_member_state',)


    def __init__(self, *args, **kwargs):
        super(CountryForm, self).__init__(*args, **kwargs)

        if self.instance.eu_member_state == "Y":
            flag_value = True
        else:
            flag_value = False

        self.initial['eu_member_state_flag'] = flag_value
然后在views.py中获取CheckboxInput字段的值,并将其转换为“Y”或“N”

class UpdateCountryView(LoginRequiredMixin,UpdateView):
    login_url= '/login/'
    redirect_field_name = 'tour_admin/countries_list.html'
    form_class = CountryForm
    model = Countries

    def form_valid(self, form):
        if form.is_valid():
            data = form.cleaned_data

            if data['eu_member_state_flag']:
                data['eu_member_state'] = 'Y'
                self.object.eu_member_state = 'Y'
            else:
                data['eu_member_state'] = 'N'
                self.object.eu_member_state = 'N'
            self.object.save()

        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('countries_list')

我通过创建一个自定义CheckboxInput字段并在forms.py中初始化来解决这个问题

class CountryForm(forms.ModelForm):

    eu_member_state_flag = forms.BooleanField(required=False,label='EU member state')

    class Meta():
        model = Countries
        exclude = ('eu_member_state',)


    def __init__(self, *args, **kwargs):
        super(CountryForm, self).__init__(*args, **kwargs)

        if self.instance.eu_member_state == "Y":
            flag_value = True
        else:
            flag_value = False

        self.initial['eu_member_state_flag'] = flag_value
然后在views.py中获取CheckboxInput字段的值,并将其转换为“Y”或“N”

class UpdateCountryView(LoginRequiredMixin,UpdateView):
    login_url= '/login/'
    redirect_field_name = 'tour_admin/countries_list.html'
    form_class = CountryForm
    model = Countries

    def form_valid(self, form):
        if form.is_valid():
            data = form.cleaned_data

            if data['eu_member_state_flag']:
                data['eu_member_state'] = 'Y'
                self.object.eu_member_state = 'Y'
            else:
                data['eu_member_state'] = 'N'
                self.object.eu_member_state = 'N'
            self.object.save()

        return HttpResponseRedirect(self.get_success_url())

    def get_success_url(self):
        return reverse('countries_list')

你能给我们看一下你的模型吗?我已经把模型添加到最初的帖子中了。你能给我们看一下你的模型吗?我已经把模型添加到最初的帖子中了。