Django chuyển dữ liệu sang JavaScript

Thậm chí tốt hơn, bạn có thể vượt qua các cấu trúc dữ liệu phức tạp theo cách này mà không cần phải tranh luận nhiều. Ví dụ: nếu bạn có một đối tượng từ điển với các danh sách từ điển lồng nhau, bạn có thể chuyển trực tiếp đối tượng này vào thẻ mẫu json_script mà không cần thực hiện bất kỳ thao tác hoặc vòng lặp dữ liệu nào với json.dumps[] trước

Trong ví dụ này, tôi cần chuyển một đối tượng có nhiều thuộc tính bản đồ khác nhau và danh sách các điểm tham chiếu có độ dài thay đổi trong đó mỗi phần tử là một từ điển lồng nhau của [float, float, string, boolean]

Như bạn có thể thấy trong khung nhìn ở trên, chúng ta tạo một đối tượng có tên context và điền dữ liệu vào đó, đồng thời gửi nó dưới dạng tham số đầu tiên trong hàm template.render[]

Tạo biến trong mẫu

Bạn cũng có thể tạo các biến trực tiếp trong mẫu bằng cách sử dụng thẻ mẫu

from django.http import HttpResponse
from django.template import loader

def testing[request]:
  template = loader.get_template['template.html']
  context = {
    'firstname': 'Linus',
  }
  return HttpResponse[template.render[context, request]]
0

Thí dụ

templates/template.html

{% with firstname="Tobias" %}
Hello {{ firstname }}, how are you?
Chạy ví dụ »

Bạn sẽ tìm hiểu thêm về các thẻ mẫu trong chương tiếp theo

Dữ liệu từ một mô hình

Ví dụ trên cho thấy một cách tiếp cận dễ dàng về cách tạo và sử dụng các biến trong một mẫu

Thông thường, hầu hết dữ liệu bên ngoài mà bạn muốn sử dụng trong mẫu đều đến từ một mẫu

Chúng ta đã tạo một mô hình trong các chương trước, được gọi là

from django.http import HttpResponse
from django.template import loader

def testing[request]:
  template = loader.get_template['template.html']
  context = {
    'firstname': 'Linus',
  }
  return HttpResponse[template.render[context, request]]
2, chúng ta sẽ sử dụng mô hình này trong nhiều ví dụ trong các chương tiếp theo của hướng dẫn này

Để lấy dữ liệu từ mô hình

from django.http import HttpResponse
from django.template import loader

def testing[request]:
  template = loader.get_template['template.html']
  context = {
    'firstname': 'Linus',
  }
  return HttpResponse[template.render[context, request]]
2, chúng tôi sẽ phải nhập nó vào tệp views.py và trích xuất dữ liệu từ nó trong chế độ xem

Tôi cũng mới sử dụng Django. Để làm những gì bạn muốn làm [chuyển các giá trị từ python sang js], tôi đã sử dụng các truy vấn ajax [sử dụng jquery] và sau đó thực hiện một JsonResponse cho lệnh gọi ajax. Cuộc gọi ajax sau đó xử lý dữ liệu theo yêu cầu

class InstructorDeleteView[DeleteView]:
model = Instructor
success_url = reverse_lazy['instructor_list']
template_name = 'class_management/instructor_list.html'

def delete[self, request, *args, **kwargs]:
"""
Calls the delete[] method on the fetched object and then
responds to the call with the relevant data.
"""
self.object = self.get_object[]
pk = self.object.pk # Save the primary key before the object is deleted.
self.object.delete[]
data = {
'message': "Successfully deleted the instructor.",
'pk': pk,
}
return JsonResponse[data]

Sau đó, trong mẫu của bạn, bạn có thể thêm js và có lệnh gọi ajax đến chế độ xem ở trên để nó có thể nhận được JsonResponse

Có một số mã ở giữa, nhưng tôi muốn hiển thị dòng cụ thể bên dưới. Tôi đang gửi dữ liệu project_list tới cơ sở. html với kết xuất [không có json]

Tôi có thể lấy các giá trị id khi tôi viết {{ item. id }} nhưng khi tôi viết {{ item. tên }} tôi gặp lỗi *

"Truy vấn. ngoại lệ hoãn lại. Madrid không được xác định”

Ghi chú. project_list chứa dữ liệu Barcelona[id=1] và Madrid[id=2]

Bạn có biết tại sao lại xảy ra lỗi đó không và cách lấy thông tin khác như tên, địa chỉ, email, v.v. ?

*CẬP NHẬT* - Cảm ơn những người trong nhận xét đã chỉ ra rằng điều này đã tồn tại ở Django dưới dạng thẻ mẫu json_script,

Khi chúng ta muốn chuyển dữ liệu từ Django sang JavaScript, chúng ta thường nói về API, bộ nối tiếp, lệnh gọi JSON và AJAX. Điều này thường được kết hợp với sự phức tạp bổ sung khi có React hoặc Angular chạy giao diện người dùng

Nhưng đôi khi bạn muốn làm điều gì đó nhanh chóng và bẩn thỉu - vẽ biểu đồ và không bận tâm đến toàn bộ cơ sở hạ tầng ứng dụng một trang

Cách tiếp cận ngây thơ

Giả sử chúng ta có một ứng dụng Django với mô hình sau

from django.db import models


class SomeDataModel[models.Model]:
    date = models.DateField[db_index=True]
    value = models.IntegerField[]

Và chúng ta có một

from django.views.generic import TemplateView


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'
0 đơn giản

from django.views.generic import TemplateView


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'

Bây giờ, chúng ta đã quyết định vẽ một biểu đồ đường đơn giản, sử dụng Biểu đồ. js và chúng tôi muốn tránh thực hiện lệnh gọi AJAX/lộ API/v.v.

Nếu chúng tôi muốn hiển thị một biểu đồ đường đơn giản trong

from django.views.generic import TemplateView


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'
1 của mình, thì mã sẽ trông như thế này [được lấy từ các mẫu của họ]




Điều này sẽ tạo ra những điều sau đây

Bây giờ, nếu chúng ta muốn biểu đồ dữ liệu đến từ

from django.views.generic import TemplateView


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'
2, chúng ta có thể tiếp cận nó như thế

from django.views.generic import TemplateView

from some_project.some_app.models import SomeDataModel


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'

    def get_context_data[self, **kwargs]:
        context = super[].get_context_data[**kwargs]

        context['data'] = [
            {
                'id': obj.id,
                'value': obj.value,
                'date': obj.date.isoformat[]
            }
            for obj in SomeDataModel.objects.all[]
        ]

        return context

Và sau đó, chúng tôi kết xuất một mảng JavaScript bằng mẫu Django




Bây giờ, cái này hoạt động, nhưng nó quá bẩn đối với sở thích của tôi

Chúng tôi không còn có JavaScript nữa mà thay vào đó là JavaScript, được trộn với các mẫu Django

Chúng tôi mất cơ hội trích xuất JavaScript sang một trang riêng. tập tin js. Chúng tôi cũng mất cơ hội chạy đẹp hơn trên JavaScript đó

Chúng ta có thể làm điều đó tốt hơn và vẫn nhanh chóng về điều đó

Tăng gia vị cho mọi thứ

Chiến lược mà chúng ta sẽ theo đuổi là

  1. trong chế độ xem của chúng tôi, tuần tự hóa dữ liệu qua
    from django.views.generic import TemplateView
    
    
    class SomeTemplateView[TemplateView]:
        template_name = 'some_template.html'
    3 & lưu trữ dữ liệu đó trong ngữ cảnh
  2. Kết xuất ẩn

    phần tử, với thuộc tính

    from django.views.generic import TemplateView
    
    
    class SomeTemplateView[TemplateView]:
        template_name = 'some_template.html'
    4 và
    from django.views.generic import TemplateView
    
    
    class SomeTemplateView[TemplateView]:
        template_name = 'some_template.html'
    5 duy nhất tương đương với dữ liệu JSON được tuần tự hóa

  3. Trong JavaScript, truy vấn div đó, đọc thuộc tính
    from django.views.generic import TemplateView
    
    
    class SomeTemplateView[TemplateView]:
        template_name = 'some_template.html'
    5 và sử dụng
    from django.views.generic import TemplateView
    
    
    class SomeTemplateView[TemplateView]:
        template_name = 'some_template.html'
    7 để lấy dữ liệu cần thiết

Điều này có lợi ích là giữ cho mã JavaScript sạch mọi ngôn ngữ mẫu Django và cũng có mẫu có thể sử dụng lại để lấy dữ liệu chúng tôi cần

Nó giống như làm một AJAX dễ dàng hơn

Đây là ví dụ, theo chiến lược này

import json

from django.views.generic import TemplateView


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'

    def get_context_data[self, **kwargs]:
        context = super[].get_context_data[**kwargs]

        context['data'] = json.dumps[
            [
                {
                    'id': obj.id,
                    'value': obj.value,
                    'date': obj.date.isoformat[]
                }
                for obj in SomeDataModel.objects.all[]
            ]
        ]

        return context

Bây giờ, chúng tôi sẽ trích xuất mã JavaScript của mình thành một tệp tĩnh có tên là

from django.views.generic import TemplateView


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'
8

Điều này mang lại cho chúng tôi những điều sau đây

from django.views.generic import TemplateView


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'
1

{% load static %}






Như bạn có thể thấy, điều kỳ diệu đang xảy ra trong div ẩn. Chúng tôi ẩn div để xóa nó khỏi bất kỳ bố cục nào

Tại đây, bạn có thể đặt cho nó một id thích hợp hoặc sử dụng bất kỳ phần tử HTML nào bạn thấy phù hợp

Thuộc tính

from django.views.generic import TemplateView


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'
5 [tùy ý & không phải thứ được xác định trước] chứa JSON mà chúng ta cần

Bây giờ, cuối cùng, chúng tôi sẽ triển khai chức năng đơn giản sau để lấy và phân tích dữ liệu chúng tôi cần

function loadJson[selector] {
  return JSON.parse[document.querySelector[selector].getAttribute['data-json']];
}

Và với điều đó,

from django.views.generic import TemplateView


class SomeTemplateView[TemplateView]:
    template_name = 'some_template.html'
8 của chúng ta đã sẵn sàng

function loadJson[selector] {
  return JSON.parse[document.querySelector[selector].getAttribute['data-json']];
}

window.onload = function [] {
  var jsonData = loadJson['#jsonData'];

  var data = jsonData.map[[item] => item.value];
  var labels = jsonData.map[[item] => item.date];

  console.log[data];
  console.log[labels];

  var config = {
    type: 'line',
    data: {
      labels: labels,
      datasets: [
        {
          label: 'A random dataset',
          backgroundColor: 'black',
          borderColor: 'lightblue',
          data: data,
          fill: false
        }
      ]
    },
    options: {
      responsive: true
    }
  };

  var ctx = document.getElementById['chart'].getContext['2d'];
  window.myLine = new Chart[ctx, config];
};

Một mô hình nhanh và bẩn, khi bạn chỉ muốn vận chuyển một cái gì đó. Đây là kết quả cuối cùng

tuyên bố từ chối trách nhiệm

Tôi sẽ không khuyên bạn nên sử dụng phương pháp này cho bất cứ điều gì hơn là một bằng chứng nhanh chóng và bẩn thỉu về khái niệm

Khi JavaScript của bạn bắt đầu phát triển về kích thước, sẽ rất khó để kiểm soát nó và cách tiếp cận được đề xuất là sử dụng toàn bộ SPA, sử dụng một trong những khung phổ biến [đối với chúng tôi, đó là React]

Làm cách nào để lấy dữ liệu từ Django sang JS?

Chiến lược mà chúng tôi sẽ thực hiện là. kết xuất và lưu trữ nó trong ngữ cảnh. Kết xuất phần tử truy vấn div đó, đọc thuộc tính data-json và sử dụng JSON. phân tích cú pháp để lấy dữ liệu cần thiết .

Làm cách nào để chuyển dữ liệu từ chế độ xem sang js trong Django?

Nói chung, bạn có 4 cách để chuyển dữ liệu từ JavaScript sang chế độ xem Django. .
As an element in the URL: e.g. path['/some/url//', ...].
Là dữ liệu POST trong một lần gửi biểu mẫu
Dưới dạng JSON trong POST

Django có thể hoạt động với JavaScript không?

Mặc dù phần lớn lõi của Django là Python, nhưng các ứng dụng đóng góp của quản trị viên và gis chứa mã JavaScript . Vui lòng tuân theo các tiêu chuẩn viết mã này khi viết mã JavaScript để đưa vào Django.

{% khối %} trong Django là gì?

Giới thiệu {% block %} Thẻ khối được sử dụng để xác định một khối có thể bị các mẫu con ghi đè . Nói cách khác, khi bạn xác định một khối trong mẫu cơ sở, bạn đang nói rằng khu vực này sẽ được điền nội dung từ một tệp mẫu con khác.

Chủ Đề