15

例如,我有一个名为“Client”的模型和一个名为“PhoneNumbers”的模型

class PhoneNumbers(models.Model):
    number = forms.IntegerField()

class Client(models.Model):
    number = forms.ManyToManyField(PhoneNumbers)

客户端与 PhoneNumbers 具有多对多关系。PhoneNumbers 中包含近 500,000 条记录,因此在使用带有 M2M 文件的 MultiSelect 小部件的模型表单编辑客户记录时,加载需要很长时间。事实上,它永远不会。它只是坐在那里试图加载我假设的所有电话对象。

我的解决方法是使用 ajax 和 jquery 做一些乏味的事情,只编辑客户记录中的电话号码。在浪费我的时间之前,我想看看是否有另一种方法可以在不让我的页面挂起的情况下实现它。

4

4 回答 4

8

您需要为此字段创建一个自定义小部件,以便自动完成正确的记录。如果你不想自己动手: http: //django-autocomplete-light.readthedocs.io/

我已经将它用于它的通用关系支持,M2M 自动完成看起来也非常简单和直观。在此处查看使用视频:http ://www.youtube.com/watch?v=fJIHiqWKUXI&feature=youtu.be

在阅读了您关于在管理员之外需要它的评论后,我又看了一眼django-autocomplete-light图书馆。它提供了您可以在 admin 之外使用的小部件

from dal import autocomplete
from django import forms

class PersonForm(forms.ModelForm):
    class Meta:
        widgets = {
            'myformfield': autocomplete.ModelSelect2(
                # ...
            ),
        }
于 2013-05-10T14:28:32.947 回答
6

从 Django 2.0 开始,Django Admin 附带了一个autocomplete_fields属性,可以为外键和多对多字段生成自动完成小部件。

class PhoneNumbersAdmin(admin.ModelAdmin):
    search_fields = ['number']

class ClientAdmin(admin.ModelAdmin):
    autocomplete_fields = ['number']

请注意,这当然只适用于 Django 管理员的范围。要在管理员之外获取自动完成字段,您需要一个额外的包,例如django-autocomplete-light其他答案中已经建议的包。

于 2018-03-18T18:19:21.837 回答
4

开箱即用,模型管理员有一个raw_id_fields选项可以让您的页面加载得更快。但是,原始 id 字段的用户界面不是很直观,因此您可能必须推出自己的解决方案。

于 2013-05-10T14:27:31.443 回答
0

我们为此使用此第 3 方小部件:

https://github.com/crucialfelix/django-ajax-selects

顺便说一句,由于多种原因,您上面的“示例”确实是糟糕的数据库设计。您应该只将电话号码作为客户端模型上的文本字段,然后您就不会遇到这些问题。;-)

于 2017-06-14T01:35:31.810 回答