Как получить значение из радиокнопок в форме Django?

У меня есть HTML форма. Мне нужно получить значение из радиокнопки, чтобы передать его экземпляру модели, но я получаю запрос без выбранного значения радиокнопки, в чем проблема?

product.html

<form action="{% url 'add_comment' %}" method="POST" class="addCommentForm" id="commentProductForm">
                        {% csrf_token %}
                        <input type="text" name="comment_text" class="search-input" id="comment_text" placeholder="Введите отзыв...">
                        <div class="rating-area">
                            <label for="star-5" title="Оценка «5»"></label> 
                            <input type="radio" id="star-5" name="rating" value="5">
                            <label for="star-4" title="Оценка «4»"></label>
                            <input type="radio" id="star-4" name="rating" value="4">
                            <label for="star-3" title="Оценка «3»"></label>  
                            <input type="radio" id="star-3" name="rating" value="3">
                            <label for="star-2" title="Оценка «2»"></label>    
                            <input type="radio" id="star-2" name="rating" value="2">
                            <label for="star-1" title="Оценка «1»"></label>
                            <input type="radio" id="star-1" name="rating" value="1">
                        </div> 
                        <input type="hidden" name="product_id" value="{{ product.id }}">
                        <input type="submit" value="ОТПРАВИТЬ" class="search-btn">
                    </form>

views.py

def add_comment(request):
    if request.method == 'POST':
        '''
         A request like b'comment_text=r&product_id=14395&
         csrfmiddlewaretoken=2inK4JGd1nqjS79p5Z6x78IupBqMOcNGGMuFJKW8zYIN2pzMlij4hyumV7G5k0H1'

         But without choosen radio button
        '''
        print(f'\n{request.body}\n') 
        text = request.POST.get('comment_text')
        
        product_id = request.POST.get('product_id')
        stars = request.POST.get('rating') # Here it shows None

        print(f'\n\nType: {type(stars)}\nValue: {stars}\n\n')
        
        if text == '':
            return JsonResponse({'success': False, 'message': 'Invalid data'})

        profile = Profile.objects.get(user=request.user)
        product = Product.objects.get(id=product_id)
        
        Comment.objects.create(text=text, author=profile, product=product)
        
        return JsonResponse({'success': True, 'text': text, 'author': profile.first_name})
    
    return JsonResponse({'success': False})

Попробуйте определить звездочку по умолчанию при загрузке формы

<input type="radio" id="star-3" name="rating" value="3" checked>

Убедитесь, что ваша HTML-форма имеет правильную структуру и атрибуты:

product.html

<form action="{% url 'add_comment' %}" method="POST" class="addCommentForm" id="commentProductForm">
    {% csrf_token %}
    <input type="text" name="comment_text" class="search-input" id="comment_text" placeholder="Enter your comment...">
    <div class="rating-area">
        <input type="radio" id="star-5" name="rating" value="5">
        <label for="star-5" title="Rating «5»"></label> 

        <input type="radio" id="star-4" name="rating" value="4">
        <label for="star-4" title="Rating «4»"></label>

        <input type="radio" id="star-3" name="rating" value="3">
        <label for="star-3" title="Rating «3»"></label>  

        <input type="radio" id="star-2" name="rating" value="2">
        <label for="star-2" title="Rating «2»"></label>    

        <input type="radio" id="star-1" name="rating" value="1">
        <label for="star-1" title="Rating «1»"></label>
    </div> 
    <input type="hidden" name="product_id" value="{{ product.id }}">
    <input type="submit" value="SUBMIT" class="search-btn">
</form>

views.py

def add_comment(request):
    if request.method == 'POST':
        text = request.POST.get('comment_text')
        product_id = request.POST.get('product_id')
        stars = request.POST.get('rating')  # Retrieves the selected rating value

        if not text:
            return JsonResponse({'success': False, 'message': 'Invalid data'})

        try:
            profile = Profile.objects.get(user=request.user)
            product = Product.objects.get(id=product_id)
            
            Comment.objects.create(text=text, author=profile, product=product, rating=stars)
            return JsonResponse({'success': True, 'text': text, 'author': profile.first_name})
        except Profile.DoesNotExist:
            return JsonResponse({'success': False, 'message': 'Profile does not exist'})
        except Product.DoesNotExist:
            return JsonResponse({'success': False, 'message': 'Product does not exist'})
        except Exception as e:
            return JsonResponse({'success': False, 'message': str(e)})
    
    return JsonResponse({'success': False})

Если флажок установлен, то получаем значение в переменной stars

Пояснение:

Form Action (action): Указывает URL, по которому должны быть отправлены данные формы. В данном случае используется {% url 'add_comment' %}, который Django заменит на реальный URL, привязанный к представлению add_comment.

CSRF Token: Обеспечивает безопасность отправки формы от межсайтовых подделок запросов (CSRF).

Поля ввода:

comment_text: Поле ввода текста, в которое пользователь может ввести свой комментарий. рейтинг: Радиокнопки для выбора рейтинга от 1 до 5. product_id: Скрытое поле ввода, содержащее идентификатор продукта, для которого добавляется комментарий.

Кнопка "Отправить": При нажатии она отправляет данные формы на URL, указанный в action.

Надеюсь, это поможет!

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