我一直在努力为django admin fk字段添加自动填充功能,我已经遇到过这个第三方应用程序Django-autocomplete-light,但它的文档对于像我这样的初学者来说非常混乱。< / p>
所以,我有我的模型,我怎么能为fk字段添加自动完成功能。
Class Order(models.Models)
Client = models.ForeignKey(settings.AUTH_USER_MODEL)
答案 0 :(得分:2)
您应该查看documentation并尝试慢慢阅读。如果你提供更多细节,关于什么不适合你,也许我们可以帮助更好。一般来说,这就是所需要的:
在 views.py 文件中添加
from django.contrib.auth.models import User
from dal import autocomplete
from your_countries_app.models import Country
class ClientAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
# Don't forget to filter out results depending on the visitor !
if not self.request.user.is_authenticated():
return User.objects.none()
qs = User.objects.all()
if self.q:
qs = qs.filter(name__istartswith=self.q)
return qs
然后在 urls.py 文件中添加:
from your_countries_app.views import ClientAutocomplete
urlpatterns = [
url(
r'^client-autocomplete/$',
ClientAutocomplete.as_view(),
name='client-autocomplete',
),
]
如果让您感到困惑的话,让我们跳过文档中带有shell的部分的第二部分。所以现在你应该可以从你的浏览器访问这个地址了。
本地主机:8000 /客户端的自动完成/
你应该能够在那里以文本形式看到所有用户(这种格式称为JSON,你可以查找,如果你愿意,但我们不会处理它)。 如果您已为订单创建了另一个应用程序,而您正在使用另一个文件夹,则只需尝试使用订单作为前缀调用该URL:
本地主机:8000 /命令/客户端的自动完成/
我认为您熟悉Django中的表单,如果不熟悉take a look here.在 forms.py 中添加以下内容:
from dal import autocomplete
from django.contrib.auth.models import
from django import forms
class OrderForm(forms.ModelForm):
client = forms.ModelChoiceField(
queryset=User.objects.all(),
widget=autocomplete.ModelSelect2(url='cllient-autocomplete')
# if you are working in an orders application, and you have defined the the url
#in the orders/urls.py then call this method like this:
#widget=autocomplete.ModelSelect2(url='orders:cllient-autocomplete')
)
class Meta:
model = Order
fields = ('__all__')
我想您希望自动完成功能在管理面板视图之外工作,因此您必须在订单视图的模板中添加以下代码。请注意,您应该在base.html中定义{%block content%}和{%block footer%}:
{% extends 'base.html' %}
{# Don't forget that one ! #}
{% load static %}
{% block content %}
<div>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" />
</form>
</div>
{% endblock %}
{% block footer %}
<script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script>
{{ form.media }}
{% endblock %}