Как получить значение из радиокнопок в форме 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.
Надеюсь, это поможет!