簡體   English   中英

如何在不刷新頁面的情況下正確顯示存儲在外部 model 中的數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM