Python 如何在不刷新页面的情况下正确显示存储在外部模型中的数据?
我试图在一个框的顶部显示一个用户名,用户在该框中以表单形式输入其员工,而无需刷新页面 例如,他们输入自己的#,然后在单击下一个字段的/tab后,它会将他们的名字显示在顶部,这是来自数据库的,因此用户知道他们输入了正确的信息。这个名称存储在一个单独的模型中,所以我尝试使用“id/number”来检索它 我对AJAX不太熟悉,但在阅读了一些类似的问题之后,AJAX请求似乎是实现这一点的最合适的方法。我尝试创建一个函数get_employee_name,该函数根据我看到的另一个ajax请求的工作方式返回人员的姓名,但我不确定如何实现这一点,因此它会在输入#后显示 我的页面当前已加载,但当我使用F12检查网络时,从未调用过搜索名称以将其显示在页面上的函数/url。我不确定我可能在哪里遗漏了连接这两个代码区域的部分,但我觉得这与调用应该发生的html标记有关,因为我对html和Django不太熟悉 型号.pyPython 如何在不刷新页面的情况下正确显示存储在外部模型中的数据?,python,html,django,ajax,Python,Html,Django,Ajax,我试图在一个框的顶部显示一个用户名,用户在该框中以表单形式输入其员工,而无需刷新页面 例如,他们输入自己的#,然后在单击下一个字段的/tab后,它会将他们的名字显示在顶部,这是来自数据库的,因此用户知道他们输入了正确的信息。这个名称存储在一个单独的模型中,所以我尝试使用“id/number”来检索它 我对AJAX不太熟悉,但在阅读了一些类似的问题之后,AJAX请求似乎是实现这一点的最合适的方法。我尝试创建一个函数get_employee_name,该函数根据我看到的另一个ajax请求的工作方式返
class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
employee_number = models.ForeignKey(Salesman, on_delete=models.SET_NULL, help_text="Employee #", null=True, blank=False)
work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False)
station_number = models.ForeignKey(StationNumber, on_delete=models.SET_NULL, null=True, blank=True)
class Salesman(models.Model):
slsmn_name = models.CharField(max_length=25)
id = models.IntegerField(db_column='number', primary_key=True)
class WarehouseForm(AppsModelForm):
class Meta:
model = EmployeeWorkAreaLog
widgets = {
'employee_number': ForeignKeyRawIdWidget(EmployeeWorkAreaLog._meta.get_field('employee_number').remote_field, site, attrs={'id':'employee_number_field'}),
}
fields = ('employee_number', 'work_area', 'station_number')
class EnterExitArea(CreateView):
model = EmployeeWorkAreaLog
template_name = "operations/enter_exit_area.html"
form_class = WarehouseForm
def form_valid(self, form):
# do submission stuff..
def get_employee_name(request):
employee_number = request.GET.get('employee_number')
try:
employee = Salesman.objects.get(id=employee_number)
except Salesman.DoesNotExist:
return JsonResponse({'error': 'Employee not found'}, status=404)
employee_name = employee.slsmn_name
return JsonResponse({'employee_name': employee_name})
urlpatterns = [
url(r'enter-exit-area/$', EnterExitArea.as_view(), name='enter_exit_area'),
path('ajax/load-stations/', views.load_stations, name='ajax_load_stations'),
path('get-employee-name/', views.get_employee_name, name='ajax_get_employee_name'),
]
这是存储名称的模型
alldata/models.py
class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
employee_number = models.ForeignKey(Salesman, on_delete=models.SET_NULL, help_text="Employee #", null=True, blank=False)
work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False)
station_number = models.ForeignKey(StationNumber, on_delete=models.SET_NULL, null=True, blank=True)
class Salesman(models.Model):
slsmn_name = models.CharField(max_length=25)
id = models.IntegerField(db_column='number', primary_key=True)
class WarehouseForm(AppsModelForm):
class Meta:
model = EmployeeWorkAreaLog
widgets = {
'employee_number': ForeignKeyRawIdWidget(EmployeeWorkAreaLog._meta.get_field('employee_number').remote_field, site, attrs={'id':'employee_number_field'}),
}
fields = ('employee_number', 'work_area', 'station_number')
class EnterExitArea(CreateView):
model = EmployeeWorkAreaLog
template_name = "operations/enter_exit_area.html"
form_class = WarehouseForm
def form_valid(self, form):
# do submission stuff..
def get_employee_name(request):
employee_number = request.GET.get('employee_number')
try:
employee = Salesman.objects.get(id=employee_number)
except Salesman.DoesNotExist:
return JsonResponse({'error': 'Employee not found'}, status=404)
employee_name = employee.slsmn_name
return JsonResponse({'employee_name': employee_name})
urlpatterns = [
url(r'enter-exit-area/$', EnterExitArea.as_view(), name='enter_exit_area'),
path('ajax/load-stations/', views.load_stations, name='ajax_load_stations'),
path('get-employee-name/', views.get_employee_name, name='ajax_get_employee_name'),
]
我在阅读我可以在小部件中的“attrs”中添加一个“onchange”部分,但是我不太熟悉如何处理这个问题,并将它与来自表单而不是html的ajax请求联系起来
forms.py
class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
employee_number = models.ForeignKey(Salesman, on_delete=models.SET_NULL, help_text="Employee #", null=True, blank=False)
work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False)
station_number = models.ForeignKey(StationNumber, on_delete=models.SET_NULL, null=True, blank=True)
class Salesman(models.Model):
slsmn_name = models.CharField(max_length=25)
id = models.IntegerField(db_column='number', primary_key=True)
class WarehouseForm(AppsModelForm):
class Meta:
model = EmployeeWorkAreaLog
widgets = {
'employee_number': ForeignKeyRawIdWidget(EmployeeWorkAreaLog._meta.get_field('employee_number').remote_field, site, attrs={'id':'employee_number_field'}),
}
fields = ('employee_number', 'work_area', 'station_number')
class EnterExitArea(CreateView):
model = EmployeeWorkAreaLog
template_name = "operations/enter_exit_area.html"
form_class = WarehouseForm
def form_valid(self, form):
# do submission stuff..
def get_employee_name(request):
employee_number = request.GET.get('employee_number')
try:
employee = Salesman.objects.get(id=employee_number)
except Salesman.DoesNotExist:
return JsonResponse({'error': 'Employee not found'}, status=404)
employee_name = employee.slsmn_name
return JsonResponse({'employee_name': employee_name})
urlpatterns = [
url(r'enter-exit-area/$', EnterExitArea.as_view(), name='enter_exit_area'),
path('ajax/load-stations/', views.load_stations, name='ajax_load_stations'),
path('get-employee-name/', views.get_employee_name, name='ajax_get_employee_name'),
]
视图.py
class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
employee_number = models.ForeignKey(Salesman, on_delete=models.SET_NULL, help_text="Employee #", null=True, blank=False)
work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False)
station_number = models.ForeignKey(StationNumber, on_delete=models.SET_NULL, null=True, blank=True)
class Salesman(models.Model):
slsmn_name = models.CharField(max_length=25)
id = models.IntegerField(db_column='number', primary_key=True)
class WarehouseForm(AppsModelForm):
class Meta:
model = EmployeeWorkAreaLog
widgets = {
'employee_number': ForeignKeyRawIdWidget(EmployeeWorkAreaLog._meta.get_field('employee_number').remote_field, site, attrs={'id':'employee_number_field'}),
}
fields = ('employee_number', 'work_area', 'station_number')
class EnterExitArea(CreateView):
model = EmployeeWorkAreaLog
template_name = "operations/enter_exit_area.html"
form_class = WarehouseForm
def form_valid(self, form):
# do submission stuff..
def get_employee_name(request):
employee_number = request.GET.get('employee_number')
try:
employee = Salesman.objects.get(id=employee_number)
except Salesman.DoesNotExist:
return JsonResponse({'error': 'Employee not found'}, status=404)
employee_name = employee.slsmn_name
return JsonResponse({'employee_name': employee_name})
urlpatterns = [
url(r'enter-exit-area/$', EnterExitArea.as_view(), name='enter_exit_area'),
path('ajax/load-stations/', views.load_stations, name='ajax_load_stations'),
path('get-employee-name/', views.get_employee_name, name='ajax_get_employee_name'),
]
url.py
class EmployeeWorkAreaLog(TimeStampedModel, SoftDeleteModel, models.Model):
employee_number = models.ForeignKey(Salesman, on_delete=models.SET_NULL, help_text="Employee #", null=True, blank=False)
work_area = models.ForeignKey(WorkArea, on_delete=models.SET_NULL, null=True, blank=False)
station_number = models.ForeignKey(StationNumber, on_delete=models.SET_NULL, null=True, blank=True)
class Salesman(models.Model):
slsmn_name = models.CharField(max_length=25)
id = models.IntegerField(db_column='number', primary_key=True)
class WarehouseForm(AppsModelForm):
class Meta:
model = EmployeeWorkAreaLog
widgets = {
'employee_number': ForeignKeyRawIdWidget(EmployeeWorkAreaLog._meta.get_field('employee_number').remote_field, site, attrs={'id':'employee_number_field'}),
}
fields = ('employee_number', 'work_area', 'station_number')
class EnterExitArea(CreateView):
model = EmployeeWorkAreaLog
template_name = "operations/enter_exit_area.html"
form_class = WarehouseForm
def form_valid(self, form):
# do submission stuff..
def get_employee_name(request):
employee_number = request.GET.get('employee_number')
try:
employee = Salesman.objects.get(id=employee_number)
except Salesman.DoesNotExist:
return JsonResponse({'error': 'Employee not found'}, status=404)
employee_name = employee.slsmn_name
return JsonResponse({'employee_name': employee_name})
urlpatterns = [
url(r'enter-exit-area/$', EnterExitArea.as_view(), name='enter_exit_area'),
path('ajax/load-stations/', views.load_stations, name='ajax_load_stations'),
path('get-employee-name/', views.get_employee_name, name='ajax_get_employee_name'),
]
我试图创建的ajax请求位于这个html的末尾。我修改了我发现的一个类似的请求,但它实际上没有在屏幕上显示任何内容,不确定我是否遗漏了一个请求实际上从未被调用的区域,因为我不太熟悉这些类型的请求是如何工作的
进入退出区域.html
{% extends "base.html" %}
{% block main %}
<form id="warehouseForm" action="" method="POST" data-stations-url="{% url 'operations:ajax_load_stations' %}" novalidate >
{% csrf_token %}
<div>
<h1 get-employee-name-url="{% url 'operations:ajax_get_employee_name' %}"></h1>
<div>
{{ form.employee_number.help_text }}
{{ form.employee_number }}
</div>
<div>
{{ form.work_area.help_text }}
{{ form.work_area }}
</div>
</div>
<div>
<div>
<button type="submit" name="enter_area" value="Enter">Enter Area</button>
</div>
</div>
</form>
<!-- This is the dependent dropdown script -->
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
$("#id_work_area").change(function () {
var url = $("#warehouseForm").attr("data-stations-url");
var workAreaId = $(this).val();
$.ajax({
url: url,
data: {
'work_area': workAreaId
},
success: function (data) {
$("#my-hidden-div").show(); // show it
$("#id_station_number").html(data);
// Check the length of the options child elements of the select
if ($("#id_station_number option").length == 1) {
$("#id_station_number").parent().hide(); // Hide parent of the select node
} else {
// If any option, ensure the select is shown
$("#id_station_number").parent().show();
}
}
});
});
</script>
<!-- -->
<script>
$("#id_employee_number").change(function () {
var employee_number = $(this).val();
var url = $("#warehouseForm").attr("get-employee-name-url");
$.ajax({
url: url,
type:'GET',
data: {
'id': employee_number
},
success: function (data) {
var employee_name = data['employee_name'];
$('#employee_name')[0].innerHTML = employee_name;
},
error : function (data) {
var error_message = data['error'];
$('#employee_name')[0].innerHTML = error_message;
}
});
});
</script>
{% endblock main %}
{%extends“base.html”%}
{%block main%}
{%csrf_令牌%}
{{form.employee\u number.help\u text}
{{form.employee_number}
{{form.work\u area.help\u text}
{{form.work_area}}
进入区域
$(“#id#U工作区”)。更改(功能(){
var url=$(“#仓库表单”).attr(“数据站url”);
var workAreaId=$(this.val();
$.ajax({
url:url,
数据:{
“工作区”:工作区ID
},
成功:功能(数据){
$(“#我的隐藏div”).show();//显示它
$(“#id#u station_number”).html(数据);
//检查选项的子元素的长度
if($(“#id#U站#U号选项”)。长度==1){
$(“#id#u station_number”).parent().hide();//隐藏选定节点的父节点
}否则{
//如果有任何选项,请确保显示select(选择)
$(“#id#u station_number”).parent().show();
}
}
});
});
$(“#id#U员工#U编号”)。更改(函数(){
var employee_number=$(this.val();
var url=$(“#仓库表单”).attr(“获取员工姓名url”);
$.ajax({
url:url,
类型:'GET',
数据:{
“id”:员工编号
},
成功:功能(数据){
var employee_name=数据['employee_name'];
$('#雇员姓名')[0].innerHTML=雇员姓名;
},
错误:函数(数据){
var error_message=数据['error'];
$('#员工姓名')[0].innerHTML=错误消息;
}
});
});
{%endblock main%}
什么可能导致页面上没有呈现任何内容?html部分是否缺少调用
我假设onchange()应该放在某个地方,但我不确定它会放在哪里,因为表单字段是它自己的东西,没有标签。关于
var url = $("#warehouseForm").attr("get-employee-name-url");
id引用的表单没有属性名“get employee name url”。你的url实际上在这里
<h1 get-employee-name-url="{% url 'operations:ajax_get_employee_name' %}"></h1>
关于
var url = $("#warehouseForm").attr("get-employee-name-url");
id引用的表单没有属性名“get employee name url”。你的url实际上在这里
<h1 get-employee-name-url="{% url 'operations:ajax_get_employee_name' %}"></h1>
您是否尝试在js上添加调试器以查看是否所有内容都正常工作?同意@almanegra,在使用模板时将URL直接放入js代码中,并且由于它是静态URL,请使用
let
而不是var
。您应该能够在启动Django development server的终端中看到您的页面发出的所有请求,发布这些请求以便我们知道发生了什么。对不起,我之前的评论有点搞砸了。由于您在django模板中使用JS(我不太喜欢),建议在您的JS代码中使用let url=“{%url”操作:ajax\u get\u employee\u name%}”
(django模板将自动解决此问题)@almanegra我尝试进行此更改,但仍然没有调用任何内容。我从未使用过JS/ajax请求,所以我是根据另一个已经在代码中创建依赖下拉列表的请求来创建的,所以我甚至不确定ajax是否有效。我添加了另一个脚本,以大致了解我尝试如何创建此请求。此代码是否托管在git repo中,以便我们可以尝试复制?您是否尝试在js上添加调试器,以查看是否所有内容都是