Как создать экземпляры модели из html-формы и сохранить в AuraDb?

Большинство онлайн-учебников и видеороликов описывают, как создавать и сохранять экземпляры моделей в локальной базе данных с помощью Django. Я нашел эту статью на Medium https://medium.com/swlh/create-rest-api-with-django-and-neo4j-database-using-django-nemodel-1290da717df9, объясняющую, как загрузить модель в Neo4j. Я попытался запустить тот же проект, и вот что получилось, когда я перешел по адресу http://127.0.0.1:8000/person (см. снимок ниже).

enter image description here

Объект "Person" является структурированным узлом (StructuredNode), определенным следующим образом в models/person.py:

from neomodel import StructuredNode, StringProperty, IntegerProperty,UniqueIdProperty, RelationshipTo
from myapi.models.city import City


class Person(StructuredNode):
    uid = UniqueIdProperty()
    name = StringProperty(unique_index=False)
    age = IntegerProperty(index=True, default=0)
    email = StringProperty(unique_index=True)

    # Relations :
    city = RelationshipTo(City, 'LIVES_IN')
    friends = RelationshipTo('Person','FRIEND')

    def __unicode__(self):
        return self.uid

Я хочу получить данные от пользователя через форму и сохранить их как экземпляр объекта Person в моей AuraDB: person.save() Поэтому в `views/forms.py' я создал форму следующего вида:

from django import forms
from splitjson.widgets import SplitJSONWidget
from myapi.models import Person


class testForm(forms.Form):
    attrs = {'class': 'special', 'size': '40'}
    data = forms.CharField(widget=SplitJSONWidget(attrs=attrs, debug=True))
    class Meta:
        model = Person

и я добавил его в качестве пути к urls.py:

from django.urls import re_path as url
from myapi.views import *
from django.urls import path
urlpatterns = [
    path('', home, name='home'),
    path('home', home, name='home'),
    path('sign-up', sign_up, name='sign_up'),
    path('test-dict', test_dict, name='test_dict'),
    path('person',personDetails),
    path('getAllPersons',getAllPersons),
    path('city',cityDetails),
    path('getAllCities',getAllCities),
    path('connectPaC',connectPaC),
    path('connectPaP',connectPaP)
]

Путь с именем test-dict ведет к этой функции, определенной в home.py, которая пытается получить доступ к testForm, созданному ранее.:

from django.template import RequestContext
from .forms import testForm
from django.template.loader import render_to_string

def test_dict(request):
    json = {'name': 1,
            'age': 4}
    form = testForm(request.POST or None, initial={'data': json})
    if form.is_valid():
        # validate and save
        pass

    template = 'myapi/test_template.html'
    #context = RequestContext(request, render_to_string(form))
    return render(request, template, {'form': form})

И, наконец, вот как выглядит views/persons.py:

from django.http import JsonResponse
from myapi.models import Person
from django.views.decorators.csrf import csrf_exempt
import json
from django.shortcuts import render, redirect


def getAllPersons(request):
    if request.method == 'GET':
        try:
            persons = Person.nodes.all()
            response = []
            for person in persons :
                obj = {
                    "uid": person.uid,
                    "name": person.name,
                    "age": person.age,
                }
                response.append(obj)
            return JsonResponse(response, safe=False)
        except:
            response = {"error": "Error occurred"}
            return JsonResponse(response, safe=False)
@csrf_exempt
def personDetails(request):
    if request.method == 'GET':
        # get one person by name
        name = request.GET.get('name', ' ')
        try:
            person = Person.nodes.get(name=name)
            response = {
                "uid": person.uid,
                "name": person.name,
                "age": person.age,
            }
            return JsonResponse(response, safe=False)
        except :
            response = {"error":"Error occurred"}
            return JsonResponse(response, safe=False)
            #return render(response, 'myapi/test_template.html')

    if request.method == 'POST':
        # create one person
        json_data = json.loads(request.body)
        name = json_data['first_name']
        email = str(json_data['email'])
        try:
            person = Person(name=name, email=email)
            person.save()
            response = {
                "uid": person.uid,
            }
            return JsonResponse(response)
        except :
            response = {"error":"Error occurred"}
            return JsonResponse(response, safe=False)

    if request.method == 'PUT':
        # update one person
        json_data = json.loads(request.body)
        name = json_data['name']
        age = int(json_data['age'])
        uid = json_data['uid']
        try:
            person = Person.nodes.get(uid=uid)
            person.name = name
            person.age = age
            person.save()
            response = {
                "uid": person.uid,
                "name": person.name,
                "age": person.age,
            }
            return JsonResponse(response, safe=False)
        except:
            response = {"error":"Error occurred"}
            return JsonResponse(response, safe=False)

    if request.method == 'DELETE':
        # delete one person
        json_data = json.loads(request.body)
        uid = json_data['uid']
        try:
            person = Person.nodes.get(uid=uid)
            person.delete()
            response = {"success": "Person deleted"}
            return JsonResponse(response, safe=False)
        except:
            response = {"error":"Error occurred"}
            return JsonResponse(response, safe=False)

Но это все еще не работает. Я хочу узнать, как можно создать экземпляр 'Person' на основе данных, полученных от пользователя через форму, и сохранить его в AuraDB (соединение с AuraDB, кстати, работает нормально). Я думаю, что это, конечно, возможно, но так как я совсем новичок, я могу реализовать это не совсем правильно.

Вернуться на верх