Как исправить ошибку, которую выдает 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'),

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