django - 如何根据在模型级别定义的枚举字段在 Django Modelform 中呈现单选按钮选择?
问题描述
我在模型级别定义了一个枚举字段(“类型”),如下所示,我应该如何在我的模型字段中实现相应的 ModelForm 字段?实际上,呈现的 HTML 代码不会输出单选按钮,而是将此字段包装在一个空列表中。是否应该“复制”表单类中的枚举选项以填充单选按钮选项,是否还有另一个可以利用模型级别已经定义的选项?
呈现的 HTML
<div class="form-group">
<label for="id_type_0">Type</label>
<ul id="id_type" class="form-control">
</ul>
</div>
模型.py
class Foo(models.Model):
name = models.CharField(max_length=50, blank=False, null=False)
TYPE_LIST = [
('EXT_CL', 'Customer'),
('INT_TP', 'Internal third party'),
('INT_OW', 'Owner'),
]
type = models.CharField(max_length=6, choices=TYPE_LIST,default='EXT_CL')
class Meta:
managed = True
db_table = 'foos'
fields = ('name','type')
def __str__(self):
object_name = self.name
return object_name
表格.py
class FooCreateForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.label_suffix = ''
self.fields['name'] = forms.CharField(label='Name',widget=forms.TextInput(attrs={ 'class': 'form-control' }))
self.fields['type'] = forms.ChoiceField(label='Type',required=True,widget=forms.RadioSelect(attrs={ 'class': 'form-control' }))
class Meta(object):
model = Foos
fields = ('name','type')
def clean_name(self):
name = self.cleaned_data['name']
return name
def clean_type(self):
type = self.cleaned_data['type']
return type
模板.html
<form id="foo-create-form" method="post" action=" " role="form">
{% csrf_token %}
<div class="form-group">
{{ foo_create_form.name.label_tag }}
{{ foo_create_form.name }}
</div>
<div class="form-group">
{{ foo_create_form.type.label_tag }}
{{ foo_create_form.type }}
</div>
</form>
解决方案
您应该设置选项forms.py
而不是models.py
class FooCreateForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.label_suffix = ''
TYPE_LIST = [
('EXT_CL', 'Customer'),
('INT_TP', 'Internal third party'),
('INT_OW', 'Owner'),
]
self.fields['name'] = forms.CharField(label='Name',widget=forms.TextInput(attrs={ 'class': 'form-control' }))
self.fields['type'] = forms.ChoiceField(label='Type',choice=TYPE_LIST, required=True,widget=forms.RadioSelect(attrs={ 'class': 'form-control' }))
class Meta(object):
model = Foos
fields = ('name','type')
def clean_name(self):
name = self.cleaned_data['name']
return name
def clean_type(self):
type = self.cleaned_data['type']
return type
推荐阅读
- python - bs4 BeautifulSoup - 找不到看起来像自定义标签的东西来挽救我的生命
- django - 如何将函数名作为动态 url 的参数传递?
- arrays - 我的反向数组在 C 中添加了什么随机字符
- javascript - 如何获得更改总和 foreach
- dart - 有限类型作为 Dart linting 中的传递参数
- javascript - 将外部设备监听到与 NodeJS 中的热点连接的本地服务器
- swiftui - SwiftUI 中带括号的奇怪渲染行为
- python - 2D numpy 数组中常见元素的成对计数
- docker-compose - service 必须是映射,而不是 NoneType
- c++ - C ++在另一个进程之后执行一个子进程迭代