【问题标题】:Django Jquery Autofill data from models来自模型的 Django Jquery 自动填充数据
【发布时间】:2021-11-19 10:43:24
【问题描述】:

我想制作这样的自动填充表单:

http://www.tutorialspark.com/jqueryUI/jQuery_UI_AutoComplete_Overridding_Default_Select_Action.php

我已经知道的是从模型中获取城市列表:

views.py

def autofill(request):
if 'term' in request.GET:
    qs = City.objects.filter(cities__icontains=request.GET.get('term'))
    citys = list()
    
    citys = [city.cities for city in qs]
    return JsonResponse(citys, safe=False)
    
return render(request, 'part/test.html',)

jquery:

<script>
    $(document).ready(function() {
        
        var zipCode = { Chicago: 60290, California: 90001, Chennai: 600040, 
                        Cambridge:02138 , Colombo:00800 };
        
        $('#autoSuggest').autocomplete({
            source: "{% url 'autofill' %}",
            select: function(event, ui) {
                $('#zipCode').val(zipCode[ui.item.value]);
            }
        })
    });
</script>   

模型.py

class City(models.Model):
 cities = models.CharField(max_length=120)
 zipcode = models.CharField(max_length=120)

 def __str__(self):
    return self.cities

虽然我仍然不明白如何从模型中获取邮政编码数据,并将其与城市配对? 谢谢

【问题讨论】:

  • 也显示你的models.py文件
  • @Rvector 已更新

标签: jquery django jquery-ui-autocomplete autofill


【解决方案1】:

另一个答案也有效,但这是一种无需将所有邮政编码加载到内存中的方法,只加载您需要的一个:

views.py
def get_zipcode(request, city_name):
    city = get_object_or_404(City, cities=city_name)
    return JsonResponse({zipcode: city.zipcode}, safe=False)
        
urls.py
path('get_zipcode/<str:city_name>/', get_zipcode, name='get_zipcode'),
js
<script>
    $(document).ready(function() {
        $('#autoSuggest').autocomplete({
            source: "{% url 'autofill' %}",
            select: async function(event, ui) {
                let resp = await fetch(`/get_zipcode/${ui.item.value}/`);
                let json = await resp.json()
                $('#zipCode').val(json.zipcode);
            }
        })
    });
</script>  

【讨论】:

  • 嗨,当我尝试这个时,我从 Return JsonResponse 行收到错误未知的邮政编码
【解决方案2】:

您可以在 Django 中使用 AJAX 来获取城市和邮政编码,而无需像这样刷新页面:

"""your vieww.py that return a JSON response to the frontend"""
from django.http import JsonResponse
from .models import City

def city_zipcode(request):
    """Retrieve all cities objects and return only cities and zipcode"""
    cities = City.objects.values('cities', 'zipcode')
    """Here w'll have an object like <QuerySet [{'cities': 'Chicago', 'zipcode': 60290}, ... ]>"""

    # Transform this queryset to dict with cities and zipcode as Key/Pair

    data_dict = {}
    for dict in cities:
        data_dict[dict['cities']] = dict['zipcode']
        
    """Here data_dict = {'Chicago': 60290, ...}"""
    
    return JsonResponse(data_dict)


# urls.py
path('city_zipcode/', views.city_zipcode, name='city_zipcode'),

// javascript, this is in the template file (add this before the close body tag)
{% block javascript %}
<script>
    async function getCities() {
        // Django like url in JS
        let url = '{% url 'city_zipcode' %}';
        try {
            // Get the backend JSON result
            let results = await fetch(url);
            return await results.json();
        } catch (error) {
            console.log(error);
        }
    }
    
    // Call the function to get the cities paired with zipcode
    let zipCode = await getCities();

    // Here you can run your jQuery code
    $(document).ready(function() {
    
        // Use zipCode variable here, you can try to convert it to
       // javascript dict before use it :
       zipCode = JSON.parse(zipCode);  // A javaScript object
    });

</script>
{% endblock %}

【讨论】:

  • 未捕获的语法错误:await 仅在异步函数和模块的顶层主体中有效
猜你喜欢
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2012-10-21
  • 2021-03-16
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多