Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 在最新版本的Django autocomplete light中,modelform_factory的替代品是什么?_Jquery_Django_Modelform_Django Autocomplete Light - Fatal编程技术网

Jquery 在最新版本的Django autocomplete light中,modelform_factory的替代品是什么?

Jquery 在最新版本的Django autocomplete light中,modelform_factory的替代品是什么?,jquery,django,modelform,django-autocomplete-light,Jquery,Django,Modelform,Django Autocomplete Light,在早期版本的autocomplete light中,有一种非常快速的方法可以添加新表单 form = modelform_factory(ModelName, fields='__all__') 如果模型注册了自动完成视图,则会根据给定的模型自动构建一个新表单。很快很容易。在今天发布的最新版本3.1.6中,此功能似乎已被删除。我不得不回去重做所有东西来升级,我想知道在新版本中是否有像旧的modelform\u工厂这样的东西我刚刚错过了。或者,有没有一种快速的方法来设置一个通用的自动完成视图/表

在早期版本的autocomplete light中,有一种非常快速的方法可以添加新表单

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

如果模型注册了自动完成视图,则会根据给定的模型自动构建一个新表单。很快很容易。在今天发布的最新版本3.1.6中,此功能似乎已被删除。我不得不回去重做所有东西来升级,我想知道在新版本中是否有像旧的
modelform\u工厂
这样的东西我刚刚错过了。或者,有没有一种快速的方法来设置一个通用的自动完成视图/表单,以便于重用?任何想法都值得欣赏。

因此,经过大量的搜寻,我找不到任何类似于之前的autocomplete light模型工厂的东西,所以我决定自己制作。下面是一个直接取自我们生产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(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"])
这模仿了autocomplete早期的modelform_工厂的功能,使得创建autocomplete表单并在完成所有设置后根据需要将其添加到管理员中变得非常简单。希望这能帮你节省一些时间