Использование jQuery для доступа к базе данных Django
Хорошо, я пытаюсь выяснить это уже около недели и не могу найти прямой ответ в интернете:
Я делаю Django сайт и мне нужно получить доступ к моей базе данных (которая является SQLite3) в jQuery для редактирования содержимого моего сайта.
Допустим, у меня есть одномерная база данных следующего вида:
В моем Django "Views.py" у меня есть следующее:
from exampleapp.models import database
def page(request):
data = database.objects.all()
return(render(request, "homepage.html", {"data": data}))
В моем HTML-файле есть следующее (это итерация базы данных):
{% for x in data %}
<p id = {{x}} > {{x}} </p>
{% endfor %}
На HTML-странице выводится следующее:
В любом случае, id каждого элемента DOM равен его содержимому ("яблоко", "сыр" и т.д...). Я хотел бы ссылаться на эти id в jQuery, чтобы я мог их редактировать. Например, если я хочу сослаться на элемент с id = "cheese", как я могу сделать это в jQuery? Я понимаю, что в jQuery есть функция Ajax, которая позволяет разбирать JSON. Я могу преобразовать мою базу данных в формат JSON с помощью этого в моем файле "Views.py" (но я все еще не знаю, как получить доступ к этой новой сериализованной версии моих данных, если я не использую Python для сохранения их в файл .json):
from exampleapp.models import database
from django.core.serializers import serialize
def page(request):
data = database.objects.all()
dataj = serialize("json", data, fields=("title"))
return(render(request, "homepage.html", {"data": data}))
и, следовательно, используйте это в jQuery, чтобы получить этот JSON:
$.ajax({
dataType: "json",
url: url, //If I use this method, where do I draw the JSON from? The database file itself?
//Do I have to create a JSON file in my Django "Views.py" of my serialized data and then use that
//path as the URL? This is where I am mixed up.
data: "text",
success: success
})
Единственный способ, который я вижу, чтобы сослаться на базу данных - это импортировать ее в файл jQuery, а затем, следовательно, я могу итерировать содержимое, чтобы иметь возможность получить индекс итерации базы данных в HTML (или, возможно, забыть цикл for в HTML и работать с базой данных полностью в jQuery). Как мне ссылаться на элементы, которые были в цикле for в HTML?
Также (и, возможно, более эффективный метод решения моей проблемы), Как я могу превратить мою базу данных SQLite3 в JSON, чтобы я мог использовать ее в моем jQuery файле? Или есть лучший способ "импортировать" мою базу данных в мой файл jQuery, который встроен в Django?
Это большая тема. Промышленный стандарт для выполнения того, что вы хотите, - это создание RESTful API. Большой проблемой здесь является то, что JavaScript (например, jQuery) выполняется на браузере клиента, а не на сервере, который вы контролируете. Это открывает всевозможные проблемы безопасности.
К счастью, Django REST Framework здесь, чтобы помочь.
Я бы рекомендовал просмотреть учебник по DRF, чтобы начать работу.
Хорошо, наконец-то я нашел простое решение этой проблемы!
Включает в себя 3 шага:
- В вашем файле "views.py":
database = "apple, cheese, oatmeal, nootnoot, sosbrigade"
def homepage(request):
data = database.objects.all() #1. Retrieve Your Database.
datacount = data.count() #2. Get the Number of Items in your Database.
r = [] #3. An empty list to contain the range of numbers from to datacount.
for x in range(0, datacount):
#4. Add the range of numbers to the list r.
r.append(x)
#5. "Zip" both the range numbers (r) and the database items (data) together.
#This will create a list in this format: [(0, item1), (1, item2)...]
d = zip(r, data)
#Return the list d as "data" for the HTML template.
return(render(request, "homepage.html", {"data": d}))
- В вашем HTML-файле:
<!--
{{x.0}} outputs the item **index**
{{x.1}} outputs the **actual** item contents.
when you set the element's id to "data{{x.0}}", it's id will be "data0, data1,
data2... etc", whilst the text of the element is {{x.1}}, which is the database.
-->
{% for x in data %}
<p id = data{{x.0}} > {{x.1}} </p>
{% endfor %}
<!--
This will output:
apple (but it's id will be "data0")
cheese (but it's id will be "data1")
oatmeal (but it's id will be "data2")
nootnoot (but it's id will be "data3")
sosbrigade (but it's id will be "data4")
-->
Это решает мою проблему, потому что в моем файле jQuery я могу ссылаться на эту базу данных систематически, а не по их содержимому:
- В вашем jQuery (или Javascript файле; с соответствующим переводом кода):
$(document).ready(function() {
//I can access the database like this (by index) or I could tweak the
//element's id's in a way that makes it easier for me to access them, since
// I have both an index and the contents.
//I think you can also use the $(":contains("text") function of jQuery to perhaps
//Find the id of the element by it's database content.
$("#data0").text("YASS!")
//This changes "apple" to "YASS!" :P.
});
Это очень просто, но это ответило на мой вопрос и позволило мне избежать любых вызовов API, пользовательских тегов шаблонов и т.д...