Django,jquery.formset和Select2问题

时间:2014-05-28 00:41:02

标签: javascript django jquery-select2

使用Django 1.6,django-select2(最新)和jquery.formset.js(最新),我正在努力应对非常简单的事情。基本上当我使用jquery.formset.js提供的add formset功能时,新的formset缺少django-select2提供的select字段,尽管formset的其余部分渲染得很好。

这是一个相当基本的设置:

class PartNumber(models.Model):
    name = models.CharField("Description", max_length=100)
    supplier_part_number = models.CharField(max_length=30, unique=True, blank=True, null=True)

class PurchaseOrder(models.Model):
    po_number = models.CharField('PO number', max_length=10, unique=True)
    ordered_date = models.DateField(default=today)

class PurchaseOrderPart(models.Model):
    part_number = models.ForeignKey(PartNumber, related_name='purchases')
    po_number = models.ForeignKey(PurchaseOrder, related_name='partslist')
    delivery_date = models.DateField(null=True, blank=True)
    qty_ordered = models.IntegerField('Quantity ordered',validators=[MinValueValidator(1)])
    cost = models.DecimalField('Unit Cost', max_digits=10,decimal_places=2,blank=True,null=True)

我有一个PurchaseOrder的创建视图,其中PurchaseOrderParts为inline_formset:

class PurchaseOrderPartForm(forms.ModelForm):
    part_numbers = PartNumberChoices()
    class Meta:
      fields = ('part_numbers', 'delivery_date', 'qty_ordered', 'cost')
      model = PurchaseOrderPart
      widgets={
        'part_numbers': forms.Select(attrs={'class':'form-control'}),
        'delivery_date': CalendarWidget(attrs={'class':'input-append form-control'}),
        'qty_ordered': forms.NumberInput(attrs={'class':'form-control'}),
        'cost': forms.NumberInput(attrs={'class':'form-control'}),
        }

POPartFormset = inlineformset_factory(PurchaseOrder, PurchaseOrderPart, form=PurchaseOrderPartForm, extra=1, can_delete=True)

我正在使用jquery.formset.js,以便有"添加"并且"删除" PurchaseOrder创建视图上的按钮,以便可以添加任意数量的PurchaseOrderPart(任何一个PO可能从1到无限部分附加,实际上更可能是< 10)。

这很好用。

但是,PurchaseOrderPart上的PartNumber fk有一个巨大的列表(大约2500个项目),因此选择列表很不方便。

我安装了django-select2并且对于它运行的容易程度印象非常深刻:

class PurchaseOrderPartForm(forms.ModelForm):
    part_numbers = PartNumberChoices()
    class Meta:
      fields = ('part_numbers', 'delivery_date', 'qty_ordered', 'cost')
      model = PurchaseOrderPart
      widgets={
        'part_numbers': django_select2.AutoHeavySelect2Widget(),
        'delivery_date': CalendarWidget(attrs={'class':'input-append form-control'}),
        'qty_ordered': forms.NumberInput(attrs={'class':'form-control'}),
        'cost': forms.NumberInput(attrs={'class':'form-control'}),
        }

这是我们遇到问题的时候。这一切都有效,直到你使用jquery.formset.js添加一个新的formset - 它渲染完美但不包括django-select2选择。

特别是,新的formset缺少此代码:

<div class="select2-container select2-container-active" id="s2id_id_partslist-1-part_numbers"><a href="javascript:void(0)" onclick="return false;" class="select2-choice" tabindex="-1">   <span class="select2-chosen">&nbsp;</span><abbr class="select2-search-choice-close"></abbr>   <span class="select2-arrow"><b></b></span></a><input class="select2-focusser select2-offscreen" type="text" id="s2id_autogen5"></div>

我如何强制插入select2-container?

1 个答案:

答案 0 :(得分:1)

这是已知的django-select2错误,已在最近的合并中得到修复。 当你说你正在运行最新版本时,你的意思是来自github还是来自PIP?

无论哪种方式,您可能会对此感兴趣: https://github.com/applegrew/django-select2/pull/127