Как исправить ошибку, которую выдает django, когда я пытаюсь нажать на кнопку обновления формы?
Я перепробовал множество различных способов, включая представления на основе классов, чтобы пользователь мог редактировать форму, которую он заполнил. Я получаю одну и ту же ошибку, что бы я ни пробовал, и не могу разобраться в ней. Я попытался разместить достаточно кода ниже, чтобы его можно было прочитать. Вот ошибки:
Тип исключения: NoReverseMatch Значение исключения:
Повтор для 'update' с аргументами '('',)' не найден. Испробован 1 шаблон(ы): ['update/(?P[^/]+)/$']
Exception Location: /Users/name/Desktop/Django/env/lib/python3.9/site-packages/django/urls/resolvers.py in _reverse_with_prefix, line 677
В шаблоне /Users/name/Desktop/Django/dv_project/myapp/templates/base.html, ошибка на строке 12
models.py
class StepOne(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
title = "STEP 1: Safety during a violent incident"
box1 = models.CharField(max_length=100, null=True)
box2 = models.CharField(max_length=100, null=True)
box3 = models.CharField(max_length=100, null=True)
box4 = models.CharField(max_length=100, null=True)
box5 = models.CharField(max_length=100, null=True)
box6 = models.CharField(max_length=100, null=True)
def __str__(self):
return self.title class StepOne(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
title = "STEP 1: Safety during a violent incident"
box1 = models.CharField(max_length=100, null=True)
box2 = models.CharField(max_length=100, null=True)
box3 = models.CharField(max_length=100, null=True)
box4 = models.CharField(max_length=100, null=True)
box5 = models.CharField(max_length=100, null=True)
box6 = models.CharField(max_length=100, null=True)
def __str__(self):
return self.title
forms.py
class StepOneForm(forms.ModelForm):
box1 = forms.CharField()
class Meta:
model = StepOne #which model we want to use as a model for our model form
fields= ("box1","box2","box3", "box4", "box5", "box6")
views.py
def update(request, id):
data = get_object_or_404(StepOne, id=id)
form = StepOneForm(instance=data)
if request.method == "POST":
form = StepOneForm(request.POST, instance=data)
if form.is_valid():
form.save()
return redirect ('user-homepage')
context = {
"form":form
}
return render(request, 'form.html', context)
urls.py
path('update/<str:id>/', views.update, name='update'),
index.html
<!-- This is the page that the link to editable the form is located, I only put the code for the button to make it shorter -->
<a href="{% url 'update' data.id %}">Edit</a>
forms.html
{{ form.box1 }}.
base.html
{% load static %}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="{% static 'website/style.css' %}">
<!-- The line and href below are really important it formats the navbar and makes the "container" gutter work. -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous">
<title>DV_Form</title>
</head>
<body>
{% include 'navbar.html' %}
<br/>
<div class="container"> <!--creates a gutter for content on homepage, this is good.-->
{% if messages %}
<ul class="messages">
{% for message in messages %}
<div class="alert alert-warning alert-dismissible fade show" role="alert">
<strong>{{message}}</strong> <!-- could write message here -->
<!-- <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> -->
</div>
{% endfor %}
</ul>
{% endif %}
{% block content %}
{% endblock %}
</div>
</body>
</html>
Если вы не передаете data
в каком-либо контексте, то вы не можете ожидать, что он будет каким-либо образом отображен в шаблоне. Он не берет его из переменных представления.
Если вы хотите, чтобы данные были в шаблоне, то добавьте их в контекст:
context = {"form": form, "data": data}
return render(request, 'form.html', context)
PS не размещайте код в комментариях. Добавьте его в свой вопрос.
Для меня хитрость заключалась в изучении фразы "передача строки запроса" Прочитав об этом в Google, я понял, в чем дело.
Мне нужно было отфильтровать формы в моем представлении. Затем, чтобы мой .html код отфильтровал форму request.user и добавил это к {% "url-name" Form.id %}, чтобы он передал form.id в urls.py, а оттуда я передал его в представление. Таким образом, получился полный круг, начиная с разбора .html-документа для поиска нужной формы через переменную request.user. Вот пример:
views.py
def form_one_page(request):
form = StepOne.objects.filter(user=request.user)
context = { 'form': form,
}
return render(request, 'form_one_page.html', context)
@login_required def editpost(request, step_one): """Функция редактирования поста формы 1""" step1 = StepOne.objects.filter(user=request.user.id) #Получает id пользователя и выясняет, есть ли у него форма StepOne. step_one = StepOne.objects.get(pk=step_one) #Получает идентификатор формы от вошедшего пользователя. Смотрите функцию form_one_page, чтобы увидеть, как она передает строку запроса. form = StepOneForm(instance=step_one) if request.method == 'POST': form = StepOneForm(request.POST, instance=step_one) if form.is_valid(): form.save() return redirect('user-homepage') return render(request,'update_form.html', {"form": form, "step1": step1})
user-homepage.html
<tbody>
<td><div class="span12" style="text-align:center">
{% for f in form1 %}
<a href="{% url 'update-post' f.id %}">
{% endfor %}
<button class="wrap_button" >Delete</button>
</a>
</div></td>
</tbody>
urls.py path('update/<step_one>', views.Step1_Form_Update, name='update-post'),