2017-02-03 66 views
1

我一直在努力向django admin fk字段添加自動完成功能,我遇到了第三方應用程序Django-autocomplete-light,但它的對於像我這樣的初學者來說,文檔非常混亂。如何使用Django自動完成燈管理外部鍵

所以,我有我的模型,我怎樣才能爲fk字段添加自動完成功能。

Class Order(models.Models) 
    Client = models.ForeignKey(settings.AUTH_USER_MODEL) 

回答

1

你應該看看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 /訂單/客戶端自動完成/

Browser view

我想,你所熟悉的在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 %}