Django 管理员添加表单 ajax 调用

Posted

技术标签:

【中文标题】Django 管理员添加表单 ajax 调用【英文标题】:Django admin add form ajax call 【发布时间】:2012-05-12 14:04:19 【问题描述】:

所以我之前在 Django/Ajax/Jquery 方面取得了成功,但我想知道是否可以在管理控制台中完成。当用户转到“添加新”表单时,我希望他们填写邮政编码并根据该邮政编码,根据我在数据库中对应于该邮政编码的值过滤下一个字段中的可用选项代码。

我正在尝试查找处理该表单的 POST 的管理视图,但我对 django 比较陌生,并且无法找到它。也许我想多了,有更简单的解决方案吗?

【问题讨论】:

【参考方案1】:
    创建一个视图,给定一个邮政编码,responds with a json list 的可用选项 (python) Override the admin template 适用于具有邮政编码字段(模板)的模型 添加监听器到邮政编码的keyup 或change 事件,即queries the view 并使用响应过滤下一个字段(javascript

【讨论】:

,我应该在哪里创建视图?我可以将自己的视图写入管理控制台中的特定页面吗? url(r'^/admin/donate/pickupschedule/add/', 'path.to.view?')。这会搞砸什么吗? 恕我直言,您将视图放在哪里并不重要。就个人而言,我会把它放在保存邮政编码模型的应用程序中,所以它看起来像 /zipcodes/suggest/ 或类似的东西【参考方案2】:

urls.py

from django.conf.urls import url

app_name = 'your_app'
urlpatterns = [
    url(r'^query/page/(?P<otherModelSlug>[a-zA-Z0-9]+)/?', PageYouQueryFrom.as_view(), name='query_page'),
    …
    # yourWebsite.com/your_app/util/kittens
    url(r'^util/(?P<fieldValue>[a-zA-Z0-9]+)/?', GetDataUtilitly.as_view(), name='get_data_util'),
]

data_template.html

result_html

page_you_want_to_ajax.html

% extends "base.html" %

% block script-inline %  
  $(document).ready( function () 
    $("#place_to_query").change(function() 
      var queryURL = "/your_app/util/" + $(this).val();
      queryBox = $(this)
      $.get(
        url: queryURL,
        contentType: "application/x-www-form-urlencoded",
      )
        .done(function( data ) 
          html = $( data ).text()
          queryBox.parent().after(html)
        );
    );
  );
% endblock script-inline %

% block content %
   otherModel  <!-- or it could be a specific  field -->
  <input id="place_to_query"></input>
  <!-- The ajax will go here afterwards-->
% endblock content %

主视图 - PageYouQueryFrom.py

# this is a Class Based View, but you can use a function based one too
class PageYouQueryFrom(TemplateView):
    template_name = 'path/to/page_you_want_to_ajax.html'

    def get_context_data(self, **kwargs):
        context_data = super(PageYouQueryFrom, self).get_context_data(**kwargs)
        context_data['otherModel'] = get_object_or_404(OtherModel, slug=self.kwargs['otherModelSlug'])
        return context_data

数据查询视图 - GetDataUtilitly.py

from django.views.generic import TemplateView
import requests
from pyquery import PyQuery

# this is a Class Based View, but you can use a function based one too
class GetDataUtilitly(TemplateView):
    template_name = 'path/to/data_template.html'
    def get_context_data(self, **kwargs):
        field_value = self.kwargs['fieldValue']
            page = requests.get('https://www.page.com?searchField=' + field_value)
            pq = PyQuery(page.content)
            # Get the (html) portion of what you want
            result_html = pq('div.c-table__row').html()
            return 'result_html': result_html

【讨论】:

以上是关于Django 管理员添加表单 ajax 调用的主要内容,如果未能解决你的问题,请参考以下文章

当浏览器中的值更改时如何刷新 django 管理表单?

Django - 从模板内部调用带有表单的视图

Python-Django 如何在管理员中使用 django-ajax-uploader?

将模型范围的帮助文本添加到 django 模型的管理表单

django - 将字段添加到用户配置文件管理表单

添加中间表单后,Django 管理站点操作不起作用