2016-07-18 3 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 

, 당신의 라인을 따라 뭔가를 할 수있는 다음 :

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

하여 사용하려면 :

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에 대한

, 당신은 다음과 같은 사용할 수 있습니다 코드에서 폼 팩터의 결과를 모델 관리자의 양식에 할당하거나 더 복잡한 양식의 기본으로 사용하는 것이 좋습니다.

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

이것은 자동 완성의 이전 모델 인 form_factory에 대한 기능을 모방하여 자동 완성 양식을 만들고 필요한 모든 항목을 설정 한 후 관리자에게 추가하는 작업을 매우 간단하게 만듭니다. 이것을 원하면 시간을 절약 할 수 있습니다.