【发布时间】:2020-04-21 11:00:54
【问题描述】:
我正在寻找一个松脆的形式版本: Django form with choices but also with freetext option?
Models.py
class Animals(models.Model):
animal_id = models.AutoField(primary_key=True)
animal_name = models.CharField(max_length=100, verbose_name='Animal Name')
forms.py
from django import forms
from django.forms import ModelForm
from .models import Animals
class CustomSelection(Field):
template = 'custom_selectbox.html'
class AnimalsForm(ModelForm):
class Meta:
model = Animals
fields = [
'animal_name',
]
def __init__(self, *args, **kwargs):
super(AnimalsForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_tag = True
self.helper.layout = Layout(
Div(
Fieldset(CustomSelection('animal_name'))
FormActions(
Button('submit','Submit')
)
)
)
如果我有:
custom_selectbox.html
{% load crispy_forms_field %}
<div class="form-group">
{{ field.label_tag }}
{% crispy_field field 'class' 'custom-select' %}
</div>
这会渲染一个框,这是我想要的第一件事。
接下来,我想知道是否有可能以某种方式注入所有现有动物名称, 像这样:
{% load crispy_forms_field %}
<input list="options" name="test-field" required="" class="form-control" id="test-field-add">
<datalist id="options">
{% for option in field.subwidgets %}
<option value="{{ option.choice_label }}"/>
{% endfor %}
</datalist>
但支持脆的形式。本质上,我希望向用户呈现现有 CharField 条目的列表 - 但如果他们正在寻找的东西不在身边,那么我希望他们能够添加它。注意:它不需要是一个字符域——我可以做一个独立的模型并使用外键,但如果我这样做,我不确定这是否意味着我需要制作一个单独的表单来为每个模型添加新条目(示例是 animal_name - 实际上我需要构建的表单有很多等效字段)。如果用户更容易添加新条目,我会接受减少对外键的字符域控制。
如果我直接制作表单,我认为 datalist 方法会起作用(请原谅我,我对 django 很陌生),但感觉就像我(希望)错过了一个更 django 式的解决方案。理想情况下,它与我现有的酥脆形式兼容。这些表单非常大,所以我大量使用 Layout() 助手,所以我真的很想避免手动重新创建所有这些。
我看过这个:Django crispy forms work with custom widgets? 但它已经很老了,我对 django 的了解还不够深入,无法知道答案是否仍然适用。
我也见过:https://leaverou.github.io/awesomplete/ - 这看起来等同于 datalist 方法。
最后,https://pypi.org/project/django-awesomplete/ - 唯一的例子是管理面板,所以我不确定我是否可以用脆表单做同样的事情。
【问题讨论】:
标签: python django django-forms