现有数据库中 Y/N 字符串字段上的 Django Forms CheckboxInput
Django Forms CheckboxInput on Y/N String field in existing database
我对 Django 比较陌生,我正在制作一个连接到现有 MySQL 数据库的表单。
我想做的是为国家/地区创建一个维护页面。我的数据库中的字段之一是 eu_member_state.
我在这里要做的是为此字段创建一个复选框,这样我就可以为最近脱离欧盟的英国取消选中它。
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')
我对 Django 比较陌生,我正在制作一个连接到现有 MySQL 数据库的表单。
我想做的是为国家/地区创建一个维护页面。我的数据库中的字段之一是 eu_member_state.
我在这里要做的是为此字段创建一个复选框,这样我就可以为最近脱离欧盟的英国取消选中它。
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')