Motokulman
@Motokulman

Как в django сделать передачу координат мыши с канвы в бд и обратно?

Здравствуйте!

Бьюсь третий день, пожалуйста, подскажите. Не могу решить проблему передачи координат из канвы в базу django и обратно.

Вот такая рисовалка схем на django. Пока рисуем просто линии, но эти линии надо сохранить в базе. То есть я рисую, она должна сразу сохраняться в базе:
5c9e18f5c2ae7566702589.pngcanvas.js:
var ctx = canvas.getContext('2d');
var raf;
var running = false;
var mouseOldPos;
var mousePos;

var wallLine = {
  draw: function() {
    ctx.beginPath();
    ctx.moveTo(mouseOldPos.x, mouseOldPos.y);
    ctx.lineTo(mousePos.x, mousePos.y);
    ctx.stroke();
  }
};

function clear() {
  ctx.fillStyle = 'rgba(255, 255, 255, 1)';
  ctx.fillRect(0,0,canvas.width,canvas.height);
}

canvas.addEventListener('mousemove', function(e) {
  ctx.lineWidth = 10.0; 
  ctx.lineCap = 'square';
  if (running) {
    clear();
    mousePos = getMousePos(canvas, e);
    wallLine.draw();
  }
});

canvas.addEventListener('click', function(e) {
  if (!running) {
    mouseOldPos = getMousePos(canvas, e);
    running = true;

  } else {
    running = false;
  }

});

function getMousePos(canvas, e) {
  var rect = canvas.getBoundingClientRect();
  return {
      x: e.clientX - rect.left,
      y: e.clientY - rect.top
  };
}


Шаблон plan_detail.html:
{% extends "base_generic.html" %}

{% block content %}
  <h1>Name: {{ plan.name }}</h1>
  <strong>Architect:</strong> {{ plan.architect }}</p>
  <p><strong>Approved:</strong> {{ plan.approved }}</p>
  <p><strong>num_elements:</strong> {{ num_elements }}</p>
  <p><strong>Approve Date:</strong> {{ plan.approve_date }}</p>  
  {% if perms.catalog.can_edit_plan %}
      <a href="{% url }">Edit</a>  
  {% endif %}
  <canvas id="canvas" style="border: 1px solid" width="1000" height="700"></canvas>
  {% load static %}   
  <script type="text/javascript" src="{% static 'js/canvas.js' %}"></script>

  <script>
    var canvas = document.getElementById('canvas');
  </script>

{% endblock %}

Как видите выше, я пытался связать все это через скрипт на странице со скриптом в файле, но не вышло.

Модель в models.py для всех линий всех схем:
class Element(models.Model):
    """Element - it's wall or smth else on the axis. Between axises"""
    #axis_owner = models.ForeignKey(Axis, on_delete=models.SET_NULL, null=True, blank=True, related_name='axis_owner') # need for slanted axises???
    plan_id = models.UUIDField(null=True, blank=True)
    axis_id = models.IntegerField()
    x0 = models.IntegerField()
    y0 = models.IntegerField()
    x1 = models.IntegerField()
    y1 = models.IntegerField()
    # for explicitly specify alignment. By default alignment define automatically:
    
    ALIGN = (
        ('l', 'Left'),
        ('r', 'Right'),
        ('c', 'Center'),
        ('a', 'Auto'),
    )

    align = models.CharField(
        max_length=1,
        choices=ALIGN,
        blank=True,
        default='c',
        help_text='You can explicitly specify alignment option. Default = Auto',
    )

    def save(self, *args, **kwargs):
        super(Element, self).save(*args, **kwargs)

    def __str__(self):
        """String for representing the Model object."""
        return self.axis_id


строчка в urls.py:
path('plan/<uuid:pk>/', views.canvasData, name='plan-detail'),


Функция в views.py:
def canvasData(request, pk):
    """View function for elements rendering on canvas"""
    context = {
        
    }
    return render(request, 'catalog/plan_detail.html', context=context)


Где pk - это pk схемы (plan_id в классе Element ), каждая схема имеет свой набор этих самых линий.

В итоге моя штука должна выглядеть примерно так:
5c9e17b3cc6d5540885093.png
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
Motokulman
@Motokulman Автор вопроса
Всем спасибо, решил вопрос просмотром вот этого видео https://youtu.be/9QNw5v6BUBE, хотя не люблю видеоуроки. Пока работает на локалке, как на боевом будет, не знаю.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы