Названия ярлыков ChartJS не отображаются, просто ID - PullRequest
0 голосов
/ 26 июня 2018

Я искал эту тему в течение пары дней, и недавно добился большого прогресса благодаря помощи моих друзей в SO.Я не мог заставить данные отображаться правильно, и теперь это происходит.Последний оставшийся кусок - чтобы ярлыки отображались правильно.Я обнаружил похожую проблему и подозреваю, что могу использовать массив, но не могу понять синтаксис.Это похожая проблема. передача каждого элемента массива в метках char.js - это код, который работает нормально, только он отображает идентификатор внешних ключей, а не фактическое имя.Если я удаляю .id из цикла меток диаграммы, диаграмма вообще не отображается.По какой-то причине я не могу получить доступ к имени данных, только идентификатор.Заранее спасибо за помощь.

Мой HTML

{% extends 'base5.html' %}

{% block body_block %}
<div class="box6">
          <h1 class="title">Number of Books By Author</h1>
<canvas id="myChart"></canvas>
<div>

  <script>
  var endpoint = '{% url "Books:chart_data" %}'
  var defaultData = [];
  var labels = [];
  array = {{ procedures3 }}
  $.ajax({
      method: "GET",
      credentials: 'same-origin',
      url: endpoint,
      success: function(data){
          defaultData = data.default
          var ctx = document.getElementById("myChart");
          var myChart = new Chart(ctx, {
              type: 'bar',
              data: {
                  labels: [{% for i in book %}{{ i.id }},{% endfor %}],
                  datasets: [{
                      label: "# of Procedures",
                      data: [{% for j in book_count %}
                               {{ j }},
                             {% endfor %}],
                      backgroundColor: [
                          'rgba(255, 99, 132, 0.2)',
                          'rgba(255, 99, 132, 0.2)',
                          'rgba(54, 162, 235, 0.2)',
                          'rgba(255, 206, 86, 0.2)',
                          'rgba(75, 192, 192, 0.2)',
                          'rgba(153, 102, 255, 0.2)',
                          'rgba(255, 159, 64, 0.2)'
                      ],
                      borderColor: [
                          'rgba(255,99,132,1)',
                          'rgba(255,99,132,1)',
                          'rgba(54, 162, 235, 1)',
                          'rgba(255, 206, 86, 1)',
                          'rgba(75, 192, 192, 1)',
                          'rgba(153, 102, 255, 1)',
                          'rgba(255, 159, 64, 1)'
                      ],
                      borderWidth: 1
                  }]
              }
          })
      },
      error: function(error_data){
          console.log("error")
          console.log(error_data)
      },
  })
  </script>
  {% endblock %}

ChartView

class ChartData(LoginRequiredMixin,APIView):
    model = Author
    authentication_classes = (SessionAuthentication, BasicAuthentication)
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        default_items = []
        labels = []
        data = {
            "labels": labels,
            "default": default_items,
        }
        return Response(data)

ChartView

class ChartView(LoginRequiredMixin, TemplateView):
template_name = 'Book/chart.html'

def get_context_data(self, **kwargs):
    context = super(ChartView, self).get_context_data(**kwargs)
    book = Author.objects.filter(id__in=self.request.user.userprofile.author.all()).order_by('id')
    books_count = [ Book.objects.filter(author=cls).count() for cls in book ]
    context['book'] = book
    context['book_count'] = books_count
    return context

Последний кусок для меня - выяснить, как получитьназвания книг вместо идентификаторов внешних ключей, которые я получаю с помощью этой строки кода:

       labels: [{% for i in book %}{{ i.id }},{% endfor %}],

Невозможно получить доступ к имени, даже если я использую i.name или i.book_name или все, что я могу придумать.После дальнейших поисков, я считаю, что мне нужно сделать какой-то тип обратного поиска имени, все еще пробуя несколько подходов.Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 26 июня 2018

Имя поля, на которое нужно сослаться, должно быть определено в вашем файле 'models.py' - неясно, уверены ли вы, что i.name или i.book_name уже определены, или вы предполагаете.Это имя столбца в исходной таблице в базе данных.Если это действительно b_name или title или что-то еще, вам нужно использовать это специально.

Другое дело, что вам могут понадобиться кавычки вокруг строк в списке меток и, возможно, встроенный тег шаблона '* 1003.* escapejs 'если есть какие-либо специальные символы, которые могут вызвать проблемы в строке, разделенной кавычками.

, поэтому попробуйте что-то вроде (название - мое предположение):

labels: [{% for i in book %}'{{ i.title|escapejs }}',{% endfor %}]
...