2016-07-18 8 views
0

以前のバージョンのオートコンプリートライトでは、新しいフォームを簡単に追加できました。モデルを提供最新バージョンのDjangoオートコンプリートライトのmodelform_factoryの代わりになるものは何ですか?

form = modelform_factory(ModelName, fields='__all__') 

は、これが自動的に与えられたモデルに基づいて新しいフォームを作成します、登録されたオートコンプリートのビューを持っていました。非常に迅速かつ簡単です。今日の最新バージョンであるバージョン3.1.6では、この機能は削除されたようです。私は戻って私たちにアップグレードするためにすべてを再加工しなければならない、と私はちょうど私が逃した新しいバージョンで利用可能な古いmodelform_factoryのようなものがあるのだろうかと思っています。または、簡単に再利用できる一般的なオートコンプリートビュー/フォームを簡単に設定する方法はありますか?どのような考えが評価されます。

答えて

1

狩りがたくさんあったため、以前のモデルのオートコンプリートライトと似たものを見つけることができなかったので、自分で作ることにしました。以下は、プロダクションCMSで持っているものから直接取った例です。対応するビューの場合

from dal import autocomplete 

from mymodels import ThisModel, ThatModel, AnotherModel 

def autocomplete_form_factory(ac_model, *args, **kwargs): 
    field_url_dict = {} 
    m2m = ('mypeeps', 'yourpeeps',) 
    if ac_model in (ThisModel, ThatModel): 
     # Connects the "stuff_field" of these 
     # models to the url named "stuff-autocomplete" 
     field_url_dict = { 
      'stuff_field': 'stuff' 
     } 
    elif ac_model == AnotherModel: 
     # Connects AnotherModel's ForeignKey field "headhoncho" 
     # and its ManyToManyFields "mypeeps" and "yourpeeps" 
     # to the "peeps-autocomplete" url 
     field_url_dict = { 
      'headhoncho': 'peeps', 
      'mypeeps': 'peeps', 
      'yourpeeps': 'peeps', 
     } 

    # Assign the appropriate widgets based on this model's autocomplete dictionary 
    ac_widgets = {} 
    ac_fields = kwargs.get('fields', ('__all__')) 
    for field, url in field_url_dict.iteritems(): 
     is_m2m = field in m2m 
     text = 'Type to return a list of %s...' if is_m2m else 'Type to return a %s list...' 
     kwargs = { 
      'url': '%s-autocomplete' % url, 
      'attrs': { 
       'data-placeholder': text % ac_model._meta.get_field(field).verbose_name, 
       'data-minimum-input-length': 3, 
      } 
     } 
     ac_widgets[field] = autocomplete.ModelSelect2Multiple(**kwargs) if is_m2m else autocomplete.ModelSelect2(**kwargs) 

    # Create the form 
    class DynamicAutocompleteForm(forms.ModelForm): 
     class Meta: 
      model = ac_model 
      fields = ac_fields 
      widgets = ac_widgets 

    return DynamicAutocompleteForm 

、次の線に沿って何かするかもしれない:

class BaseAutocomplete(autocomplete.Select2QuerySetView): 
    model = None 
    fields = ['title'] 
    filters = {} 

    def get_queryset(self): 
     if not self.request.user.is_authenticated() or not self.q or len(self.q) < 3: 
      return self.model.objects.none() 

     # OR all of our field searches together 
     obj = Q() 
     for field in self.fields: 
      kwargs = {} 
      kwargs['%s__icontains' % field] = self.q 
      obj = obj | Q(**kwargs) 

     return self.model.objects.filter(obj).filter(**self.filters) 

class StuffAutocomplete(BaseAutocomplete): 
    model = Stuff 
    filters = {'is_awesome': True} 

class PeepsAutocomplete(BaseAutocomplete): 
    model = Peeps 
    fields = ['name', 'notes'] 

をやURLのためには、次のように使用することがあります:

url(r'^stuff-autocomplete/$', StuffAutocomplete.as_view(), name='stuff-autocomplete'), 
url(r'^peeps-autocomplete/$', PeepsAutocomplete.as_view(), name='peeps-autocomplete',), 

使用するにはあなたのコードでフォームファクトリの名前を変更する場合は、次のようなものを使用して、モデル管理者のフォームに結果を割り当てたり、より複雑なフォームのベースとして使用したりします。

autocomplete_form_factory(ThisModel) 
autocomplete_form_factory(AnotherModel, fields=["headhoncho", "mypeeps"]) 

これは、オートコンプリートの初期のmodelform_factoryの機能を模倣しています。すべてをセットアップした後、必要に応じてオートコンプリートフォームを作成して管理者に簡単に追加できます。これを念頭において、ある人を救うのに役立ちます。

関連する問題