получить цепной набор запросов ajax django

#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), я вижу фактическое значение полей, которое я хотел показать.