我有一个模型表单,想用另一个模型的自动完成值填充。
模型看起来像这样。
class Company(models.Model):
short_name = models.CharField(default=" ", help_text=_('eg. RT'), max_length=5)
full_name = models.CharField(default=" ", help_text=_('eg.Revision Textiles Inc.'), max_length=100)
class Booking(models.Model):
date = models.DateTimeField(_('Booking date'), blank=True, null=True)
company = models.ForeignKey(Company, related_name='book_company', null=True, blank=True, on_delete=models.CASCADE)
在创建预订时,我想创建一个Company对象,如果该公司不存在-如果存在,那么我只想在视图中将其分配为外键。 因此,在表单中,我使用文本输入字段,而不是下拉选择,并使用自动完成的javascript创建已经存在的公司的自动填充值的列表,然后在视图中检查文本输入是否与输入的名称匹配现有公司。
表单看起来像这样。
class CreateBookingForm(ModelForm):
check_shortname = forms.CharField(label = "Short Name", max_length = 10, required = True,)
check_company = forms.CharField(label = "Full Name", max_length = 100, required = True,)
def __init__(self, *args, **kwargs):
super(CreateBookingForm, self).__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.form_id = 'booking-form'
self.helper.add_input(Submit('submit', 'Create Booking'))
class Meta:
model = Booking
fields = ['check_shortname','check_company','date',]
HTML和Javascript看起来像这样...
{% block add_to_header %}
{{ block.super }}
<script type="text/javascript" charset="utf-8">
$( function() {
var shortnameTags = [
{% for company in companies %}
"{{company.short_name}}",
{% endfor %}
];
$( "#id_check_shortname" ).autocomplete({source: shortnameTags});
} );
</script>
{% endblock %}
{% block content %}
{% crispy booking_form booking_form.helper %}
{% endblock %}
视图就是这样...
if booking_form.is_valid():
booking = booking_form.save(commit=False)
# Check if company exists
try:
this_company = Company.objects.get(shortname=booking_form.cleaned_data['check_shortname'])
except:
this_company = Company() # New object.
this_company.shortname = booking_form.cleaned_data['create_shortname']
目前,这只会自动填充id_check_shortname标记输入字段,而且我总是可以为id_check_company标记再添加一个javascript变量,但是我想做的是使用字典的键和值来自动填充完整的company_name表单中的“字段”(如果在check_shortname字段中自动填充了现有的短名称值)。在javascript中,类似...
var dict = {% for company in all_companies %}{"{{company.short_name}}" : '{{company.full_name}}',}{% endfor %};
然后使用它来自动填充两个字段。我完全不确定这是最好的还是最安全的解决方法,或者是否有更易于使用的软件包。
任何人都可以向我展示一种方法,示例代码,教程或软件包,以帮助您用dict自动填充这些字段吗?