Добавление 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 %}