基于dict值的Django Autocomplete Formfield

时间:2018-08-20 07:50:37

标签: javascript django forms autofill

我有一个模型表单,想用另一个模型的自动完成值填充。

模型看起来像这样。

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自动填充这些字段吗?

0 个答案:

没有答案