我想通过ajax请求获得一个查询集,并以与模板中的django查询集相同的方式使用它。
我有以下代码:
# view.py
def ajax_get_allocates_by_date(request):
"""
ajax 요청 함수
"""
today = timezone.localdate()
date = request.GET.get('kw', today.strftime('%Y-%m-%d'))
date=parse_date(date)
d=Date.objects.get(date=date)
allocate_list = Allocate.objects.filter(date=d)
data = {
'date': serializers.serialize(
'json',
[d]
),
'allocate_list': serializers.serialize(
'json',
allocate_list
)
}
return JsonResponse(data)
模板
<form method="get">
...
<input type="text" id="refer-date" name="refer-date" class="frm_input2 frm_date">
...
</form>
...
<script>
$('#refer-date').datepicker({
onSelect: function(dateText, inst) {
let date = $(this).val()
console.log(date)
$.ajax({
url: "{% url 'allocate:get-allocates-by-date' %}",
data: {
'kw': date
},
success: function(data) {
let date = JSON.parse(data.date)
let queryset = JSON.parse(data.allocate_list)
console.log(date)
console.log(queryset)
}
})
}
})
</script>
如果#refer-date
的值发生了更改,我会得到ajax响应,并将其记录在控制台中。然而,我的Allocate
模型还有一些其他ForeignKey关系,我也想在模板中显示这些关系。目前,我似乎只能在字段为ForeignKey的情况下渲染一些id。
最好的方法是使用django-for循环作为ajax响应,但我不确定如何实现这一点。
如有任何建议,我们将不胜感激。非常感谢。
我使用Django Rest Framework解决了这个问题。方法如下。
假设我有以下型号
class Employee(models.Model):
number = models.CharField('사원번호', max_length=30, unique=True)
dept = models.ForeignKey(
'config.Department',
on_delete=models.SET_NULL,
null=True,
verbose_name='부서',
)
class Person(models.Model):
employee = models.OneToOneField(Employee, on_delete=models.CASCADE, verbose_name='사원번호')
name = models.CharField('한글', max_length=30)
以上两个型号在同一应用程序employee
中,而型号Department
在config
应用程序中。所以在我的任期内,员工是个人(ForeignKey(的父母,部门是员工的父母。
首先,安装rest框架并设置。
其次,在应用程序(在我的例子中是员工(中创建一个名为serializers.py
的文件。
第三,在文件中我写了以下内容:
from rest_framework import serializers
from employee.models import Employee, Person
from config.models import Department
class DepartmentSerializer(serializers.ModelSerializer):
class Meta:
model = Department
fields = ('code', 'name', 'employee_set')
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = ('number',)
class PersonSerializer(serializers.ModelSerializer):
employee = EmployeeSerializer(required=True)
department = serializers.ReadOnlyField(source='employee.dept.name')
class Meta:
model = Person
fields = ('employee', 'name', 'department')
在我看来,一个重要的收获是ReadOnlyField
和source
。基本上,ReadOnlyField允许生成一个可以像Model属性一样读取的字段。source
是要从中获取值的位置。
接下来,在urls.py
中设置urlConf,如下所示:
urlpatterns = [
...
path('rest/persons/', views.person_list, name='rest-persons'),
...
]
最后,我可以在我的模板文件中发送http请求。我修改了views.py和
from rest_framework.decorators import api_view
from rest_framework.response import Response
from employee.serializers import PersonSerializer
...
@login_required
@api_view(['GET'])
def person_list(request):
"""
사원 검색시 사원번호, 이름, 부서명 담긴 json 반환하는 API
"""
if request.method == 'GET':
kw=request.GET.get('kw', '')
persons = Person.objects.filter(
Q(name__contains=kw)|
Q(employee__number__contains=kw)
)
serializer = PersonSerializer(persons, many=True)
return Response(serializer.data)
模板
<script>
$(document).ready(function() {
$.ajax({
url: '{% url "employee:rest-persons" %}',
method: 'GET',
data: {'kw': val}
}).done(function(data) {
console.log(val)
// 이전 쿼리 결과 지우기
$('#parent').empty();
for(let i=0; i<data.length; i++) {
var number=data[i].employee.number
var department=data[i].department
var name=data[i].name
var url = "{% url "employee:detail" 1234 %}".replace(/1234/, number.toString())
$('#parent').append(
`<tr>
<td><a href=${url}>${number}</a></td>
<td><a href=${url}>${name}</a></td>
<td><a href=${url}>${department}</a></td>
</tr>`
)
}
}).fail(function(data) {
console.log('error')
})
})
</script>
Volia。现在,当我发送请求(通过url(时,我可以看到我想要显示的实际字段值。