[英]How to render a piece of data stored in an external model without refreshing the page?
[英]How to correctly display data stored in an external model without refreshing the page?
我試圖在一個框的頂部顯示用戶的姓名,他們在表單中輸入員工編號,而無需刷新頁面。
例如,他們輸入他們的#,然后在他們單擊/tab 進入下一個字段后,它會將他們的名字呈現在頂部,該名字來自數據庫,因此用戶知道他們輸入了正確的信息。 此名稱存儲在單獨的 model 中,因此我嘗試使用“id/number”檢索它。
我對 AJAX 不太熟悉,但在閱讀了一些類似的問題后,似乎 AJAX 請求將是實現此目標的最合適方法。 我試圖制作一個 function get_employee_name根據我看到另一個 ajax 請求工作的方式返回人的姓名,但我不確定如何實現它,因此它會在輸入 # 后顯示。
我的頁面當前正在加載,但是當我使用 F12 檢查網絡時,永遠不會調用搜索名稱以將其顯示在頁面上的函數/url。 我不確定我可能在哪里遺漏了連接代碼的這兩個區域的部分,但我覺得它與 html 標簽有關,因為我不太熟悉 html和 Django。
模型.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)
這是存儲名稱的 model
所有數據/模型.py
class Salesman(models.Model):
slsmn_name = models.CharField(max_length=25)
id = models.IntegerField(db_column='number', primary_key=True)
我正在閱讀我可以在小部件的“屬性”中添加一個“onchange”部分,但我不太熟悉如何處理這個問題並將其與來自 forms 的 ajax 請求聯系起來,而不是 ZFC35FDC70D2FC69D26EZC57A77A7。
forms.py
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')
視圖.py
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})
網址.py
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 的末尾。 我修改了我發現的類似請求,但它實際上並沒有在屏幕上顯示任何內容,不確定我是否錯過了實際上從未調用過請求的區域,因為我不太熟悉這些類型的請求如何工作.
enter_exit_area.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 %}
什么可能導致頁面上沒有任何內容? 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>
所以也許像這樣添加一個id
<h1 id="url" get-employee-name-url="{% url 'operations:ajax_get_employee_name' %}"></h1>
然后你可以像以前一樣訪問它
var url = $("#url").attr("get-employee-name-url");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.