Данные не сохраняются в базе данных через форму клиента

Я сделал форму обратной связи с клиентом с рейтинговыми звездами. Но проблема в том, что в базу данных не попадают сохраненные данные. Где на самом деле возникла проблема? Каково соответствующее решение?

forms.py:

class FeedBackForm(forms.Form):
    feedBACK = forms.CharField(widget=forms.Textarea, required=True)     
    rating = forms.CharField(widget=forms.NumberInput) 

models.py: class ProductREVIEWS(models.Model):

rating = models.IntegerField(blank=True, null=True)
feedBACK = models.TextField(blank=True, null=True)

views.py:

def quick_view(request, quick_view_id):
    form = FeedBackForm()
    if request.method == "POST" and request.user.is_authenticated:
        form = FeedBackForm(request.POST)
        if form.is_valid():
            ProductREVIEWS.objects.create(
                feedBACK=form.cleaned_data.get('feedBACK'),
                rating=form.cleaned_data.get('product_rating'),
            )

Шаблон:

<form action="#!" method="POST" class="needs-validation mt-3" style="font-size: 13px;" novalidate="" autocomplete="off">
                        {% csrf_token %}

                        <div class="radio-toolbar d-flex">
                            <input type="radio" id="one_star" name="product_rating" value="1" checked>
                            <label for="one_star" class="mx-1">1 <i class="fas fa-star"></i></label>

                            <input type="radio" id="two_star" name="product_rating" value="2">
                            <label for="two_star" class="mx-1">2 <i class="fas fa-star"></i></label>

                            <input type="radio" id="three_star" name="product_rating" value="3">
                            <label for="three_star" class="mx-1">3 <i class="fas fa-star"></i></label>

                            <input type="radio" id="four_star" name="product_rating" value="4">
                            <label for="four_star" class="mx-1">4 <i class="fas fa-star"></i></label>

                            <input type="radio" id="five_star" name="product_rating" value="5">
                            <label for="five_star" class="mx-1">5 <i class="fas fa-star"></i></label>
                        </div>

                        <div class="mb-3 mt-2">
                            <textarea id="email" placeholder="Share your experiencs..." rows="10" style="font-size: 13px; text-transform: lowercase;" type="email" class="form-control" name="feedBACK" value="" required></textarea>
                        </div>


                    </form>

Ваш код фактически не использует функциональность форм Django. Во-первых, я бы предложил использовать форму модели, а не обычную форму - она автоматически сделает часть работы по соединению формы с вашей моделью.

https://docs.djangoproject.com/en/4.0/topics/forms/modelforms/#modelform

Во-вторых, вы проверяете форму с помощью is_valid(), но затем вручную создаете объект - вместо этого вы можете использовать save() для создания модели.

Вы можете использовать Создать представление

Django createview - это отображение формы для создания объекта, повторное отображение формы с ошибками валидации (если они есть) и сохранение объекта.

from django.views.generic.edit import CreateView

Class Post_Form(CreateView):
   model = ProductREVIEWS
   fields = ['rating', 'feedBack']
   secces_url = ('#your success url)
   template_name = '#your template'

Добавьте это в шаблон, в котором вы хотите отобразить форму:

<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save">

Поскольку вы ничего не делаете с FeedBackForm, вы можете просто получить имена полей через POST-запрос в представлении следующим образом:

from django.shortcuts import redirect
def quick_view(request, quick_view_id):
    if request.method == "POST" and request.user.is_authenticated:
        ProductREVIEWS.objects.create(
            feedBACK=request.POST.get('feedBACK'),
            rating=request.POST.get('product_rating')
        )
        return redirect('success')
    return render(request, 'some_folder_name/index.html')


def success(request):
    return render(request, 'some_folder_name/success.html')

Note: Хорошей практикой является перенаправление после работы с данными POST.

Файл шаблона:

<form method="POST" class="needs-validation mt-3" style="font-size: 13px;"   autocomplete="off">
    {% csrf_token %}

    <div class="radio-toolbar d-flex">
        <input type="radio" id="one_star" name="product_rating" value="1" checked>
        <label for="one_star" class="mx-1">1 <i class="fas fa-star"></i></label>

        <input type="radio" id="two_star" name="product_rating" value="2">
        <label for="two_star" class="mx-1">2 <i class="fas fa-star"></i></label>

        <input type="radio" id="three_star" name="product_rating" value="3">
        <label for="three_star" class="mx-1">3 <i class="fas fa-star"></i></label>

        <input type="radio" id="four_star" name="product_rating" value="4">
        <label for="four_star" class="mx-1">4 <i class="fas fa-star"></i></label>

        <input type="radio" id="five_star" name="product_rating" value="5">
        <label for="five_star" class="mx-1">5 <i class="fas fa-star"></i></label>
    </div>

    <div class="mb-3 mt-2">
        <textarea id="email" placeholder="Share your experiencs..." rows="10" style="font-size: 13px; text-transform: lowercase;" type="email" class="form-control" name="feedBACK" value="" required></textarea>
        </div>
        <input type="submit" value="save">
    </form>

urls.py

urlpatterns = [
    ...
    path('success/',views.success,name='success')
]

success.html

<body>
    <h2>Form successfully submitted.</h2>
</body>
Вернуться на верх