My Class Based View(Django) code cant recognize id from SQL database

27 Views Asked by At

I tried to make a training project with forms. I wanted to create a code for upgrading feedbacks in the form by Class Based Views. views.py

class UpdateFeedbackView(View):
    def get(self, request, id_feedback):
        feed = get_object_or_404(Feedback, id=id_feedback)
        form = FeedbackForm(instance=feed)
        return render(request, 'form_project/feedback.html', context={'form': form})

    def post(self, request, id_feedback):
        feed = get_object_or_404(Feedback, id=id_feedback)
        form = FeedbackForm(request.POST, instance=feed)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(f'/{id_feedback}')
        else:
            form = FeedbackForm(instance=feed)
        return render(request, 'form_project/feedback.html', context={'form': form})

urls.py

path('<int:id_feedback>', views.UpdateFeedbackView.as_view())

html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'feedback/field.css'%}">
</head>
<body>
    <h2>Оставьте отзыв</h2>
    <form  method="post">
        {% csrf_token %}
        {% for field in form %}
         <div class="form-style">
             {{ field.errors }}
             {{ field.label_tag }}
             {{ field }}

         </div>
        {% endfor %}




        <button type="submit">Отправить</button>
    </form>
</body>
</html>

When i try to type an feedback's id, i get this error TemplateDoesNotExist at /1

The code thinks that id does not exist. However i tried to write the same upgrade code by simple function and it worked well. By debugger, i realised that problem is in GET method but can't understand why.

What did i wrong or miss?

filetree: enter image description here

1

There are 1 best solutions below

1
willeM_ Van Onsem On

Your template form_project/feedback.html likely is not put in the right directory. This should be moved to app_name/templates/form_project/feedback.html.

Your view however implements a lot of boilerplate code, and is equivalent to an UpdateView [Django-doc]:

from django.urls import reverse_lazy
from django.views.generic import UpdateView


class UpdateFeedbackView(UpdateView):
    template_name = 'form_project/feedback.html'

    def get_success_url(self):
        return reverse('update_feed', kwargs={'pk': self.object.pk})

with as url:

path('<int:pk>', views.UpdateFeedbackView.as_view(), name='update_feed'),