Добавление object.id для рендеринга в строку, чтобы избежать ошибки django.urls.exceptions.NoReverseMatch

У меня есть проект Django, который начинается с представления списка, и когда один из объектов нажимается, он переходит к детальному представлению, которое имеет кнопку. Когда эта кнопка нажата, я использую Ajax для изменения значения булевой функции с False на True. На данный момент я дошел до того, что при нажатии на кнопку она изменяет булево значение в бэкенде с помощью Ajax, но страницу все еще нужно обновлять вручную, чтобы показать эффект изменения булева значения. Я получаю No Reverse Match Error, который, кажется, может решить эту проблему.

В моем проекте у меня есть детальное представление следующего вида

class workout_details(DetailView):
    model = Workout
    template_name = 'my_gym/start_workout.html'
    context_object_name = 'workout'

def change_status(request, id):
    context = {}

    if request.is_ajax() and request.method == 'POST':
        startsession = Workout.objects.get(id=id)
        if request.POST.get('active') == 'true':
            startsession.active = True
            startsession.save()
            context.update({'status': 'success'})
            context.update({'active': str(startsession.active)})
        html = render_to_string('my_gym/start_workout.html', context)
        return JsonResponse({'form': html})

Вот шаблон my_gym/start_workout.html :

        <!-- button -->
            <div id="startworkout">
            {% include 'my_gym/button.html' %}
            </div>
        <!-- button -->

Вот my_gym/button.html:

            <form action="{% url 'my_gym:bla' object.id %}" method='post'>
                {% csrf_token %}
                    {% if object.active %}
                    <button disabled  type="button">Start the workout</button>
                    {% else %}
                      <button value="true" id="customSwitches" onclick="start();" type="button">Start the workout</button>
                    {% endif  %}
            </form>
            <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>

            <script type="text/javascript">
                $(document).ready(function(event){
                    $(document).on('click','#customSwitches', function(event){
                        event.preventDefault();
                        var status= $(this).attr('value');
                        $.ajax({
                            type:'POST',
                            url:'{% url 'my_gym:bla' object.id %}',
                            data:{'active' : status, 'csrfmiddlewaretoken':'{{csrf_token}}'},
                            dataType:'json',
                            success:function(response){
                                $('#startworkout').html(response['form'])
                                console.log($('#startworkout').html(response['form']));
                            },
                            error:function(rs, e){
                                console.log(rs.responseText);
                            },
                        });
                    });
                });
            </script>

Вот трассировка:

Traceback (most recent call last):
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\User\Desktop\Gym_App\my_gym\views.py", line 52, in change_status
    html = render_to_string('my_gym/button.html', context)
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\base.py", line 170, in render
    return self._render(context)
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\template\defaulttags.py", line 446, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\urls\base.py", line 87, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "C:\Users\User\Desktop\Portfolio\venv\lib\site-packages\django\urls\resolvers.py", line 685, in _reverse_with_prefix
    raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'bla' with arguments '('',)' not found. 1 pattern(s) tried: ['workout/bla/(?P<id>[0-9]+)/$']

вот views.py:

app_name = 'my_gym'

urlpatterns = [
    path('', home.as_view(), name='home'),
    path('workout/<int:pk>/', workout_details.as_view(), name='workout'),
    path('workout/bla/<int:id>/', change_status, name='bla'),
]

Используйте {% url 'my_gym:bla' id=object.id %} вместо {% url 'my_gym:bla' object.id %}

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