"NoReverseMatch" when calling a function in views.py from html using Django
我试图在一个框的顶部显示一个用户的姓名,他们在一个表单中输入他们的员工编号,而无需刷新页面。
例如,他们输入他们的 #,然后在他们单击/tab 到下一个字段后,它会在顶部呈现他们的名字,它来自数据库,因此用户知道他们输入了正确的信息。此名称存储在单独的模型中,因此我尝试使用 "id/number" 检索它。
我对 AJAX 不太熟悉,但在阅读了一些类似的问题之后,似乎 AJAX 请求是实现这一目标的最合适的方式。我试图创建一个函数 get_employee_name,它根据我看到另一个 ajax 请求的工作方式返回人名,但我不确定如何实现它,因此它在输入 # 后显示。
我现在在尝试查看页面时遇到此错误,我不确定我在哪里错误地传递了 "id/employee_number",这导致显示:
1 2 | NoReverseMatch at /operations/enter-exit-area/ Reverse for 'ajax_get_employee_name' with keyword arguments '{'id': 'employee_number'}' not found. 1 pattern(s) tried: ['operations/get\\\\-employee\\\\-name\\\\/(?P<id>[0-9]+)\\\\/$'] |
models.py
1 2 3 4 5 6 7 | 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) def __str__(self): return self.employee_number |
这是存储名称的模型
alldata/models.py
1 2 3 | class Salesman(models.Model): slsmn_name = models.CharField(max_length=25) id = models.IntegerField(db_column='number', primary_key=True) |
我正在阅读我可以在小部件中的 "attrs" 中添加一个 \\'onchange\\' 部分,但我不太熟悉如何处理这个问题并将其绑定到来自表单的 ajax 请求而不是html.
forms.py
1 2 3 4 5 6 7 | 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') |
views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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') employee = Salesman.objects.get(id=employee_number) employee_name = employee.slsmn_name return employee_name |
urls.py
1 2 3 4 5 | urlpatterns = [ url(r'enter-exit-area/$', EnterExitArea.as_view(), name='enter_exit_area'), path('get-employee-name/<int:id>/', views.get_employee_name, name='ajax_get_employee_name'), ] |
我尝试创建的 ajax 请求位于此 html 的末尾。我修改了一个我发现的类似请求,但它实际上并没有在屏幕上显示任何内容,不确定我是否遗漏了一个实际上从未调用过请求的区域,因为我不太熟悉这些类型的请求工作。
enter_exit_area.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | {% extends"base.html" %} {% block main %} <form id="warehouseForm" action="" method="POST" novalidate > {% csrf_token %} <h1 get-employee-name-url="{% url 'operations:ajax_get_employee_name' id='employee_number' %}"> {{ form.employee_number.help_text }} {{ form.employee_number }} {{ form.work_area.help_text }} {{ form.work_area }} <button type="submit" name="enter_area" value="Enter">Enter Area</button> </form> $("#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')[0].innerHTML = employee_name; } }); }); |
您的代码有两个问题:
1.您没有正确反转您的 URL。
您的代码抛出此异常的原因如下:
1 | <h1 get-employee-name-url="{% url 'operations:ajax_get_employee_name' id='employee_number' %}"> |
首先,url 确实需要一个关键字参数 id,但它应该是一个 int。现在您正在传递文字值
然而,即使你要传递一个有效的变量,这仍然不起作用。
模板标签
由于您已经通过 GET 参数传递了 employeeID,因此解决此问题的最佳方法是更改?? url 以不接受参数:
1 | path('get-employee-name/', views.get_employee_name, name='ajax_get_employee_name') |
2.
来自文档:
A view function, or view for short, is simply a Python function that
takes a Web request and returns a Web response.
现在,您正在返回一个普通字符串。将字符串package在 JSON 响应中应该可以工作。此外,虽然单个字符串可能不会引起任何问题,但我喜欢将我的响应package在字典中。这也将允许您在请求无效或找不到该 ID 的员工时返回一些错误值。
1 2 3 4 5 6 7 8 9 10 | 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}) |
确保从响应中正确获取数据(并正确处理错误):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $.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; } }); |