#python #jquery #django #ajax
#python #jquery #django #ajax
Вопрос:
Я хочу получить набор запросов через 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 .
Лучшим способом было бы использовать django для цикла в качестве ответа ajax, но я не уверен, как я могу этого добиться.
Любое предложение будет высоко оценено. Спасибо.
Ответ №1:
Я решил это с помощью 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
приложении. Итак, в моем термине сотрудник является родителем для Person (ForeignKey), отдел является родителем для Employee.
Сначала установите rest framework и настройте.
Во-вторых, создайте вызываемый файл в приложении (в моем случае, employee) 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
and source
. По сути, ReadOnlyField позволяет создать поле, которое можно читать как атрибут модели. source
это то место, откуда вы хотите получить значение.
Затем установите URLconf следующим urls.py
образом:
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), я вижу фактическое значение полей, которое я хотел показать.