Флажок ВСЕГДА возвращает False / нет в request.POST - Django
У меня есть флажок в моем приложении django, где пользователь может добавить или удалить объявление из своего списка просмотра.
Однако, этот флажок всегда возвращает False, и никогда не находится в request.POST, я пробовал так много решений из SO и по всему интернету в течение буквально нескольких дней и не могу понять это
Models.py
class Watchlists(models.Model):
user = models.CharField(max_length=64, default='user')
title = models.CharField(max_length=64, blank=True)
watchlist = models.BooleanField(default=False, blank=False)
def __str__(self):
return f"{self.title}, {self.user}, {self.watchlist}"
Forms.py
class CheckForm(ModelForm):
watchlist = forms.BooleanField(required=False)
# watchlist = forms.DecimalField(widget=forms.CheckboxInput(attrs={"value":"watchlist"}))
class Meta:
model = Watchlists
fields = ['watchlist']
У чекбокса не было значения, поэтому я подумал, что проблема в этом и попытался дать ему значение здесь, в закомментированной строке, но это не помогло
Views.py
watchlist = CheckForm(request.POST or None)
if request.method == 'POST':
# if request.POST['watchlist']:
# if 'watchlist' in request.POST:
# if request.POST.get('watchlist', False):
if request.POST.get('watchlist', '') == 'on':
if watchlist.is_valid():
check = watchlist.cleaned_data['watchlist']
watchlist_data = Watchlists.objects.all().filter(title=title, user=username).first()
if not watchlist_data:
watchlisted = Watchlists.objects.create(title=title, user=username, watchlist='True')
watchlisted.save()
if watchlist_data:
watchlist_data.delete()
Я перепробовал все различные решения, которые смог найти
Шаблон
<form action="listing" method="POST">
{% csrf_token %}
{{ checkbox }}
</form>
У него есть атрибуты name и id, label тоже подходит
Во-первых, вам не нужно добавлять blank=False
в поле watchlist
, поскольку вы задали ему значение по умолчанию, поэтому перепишите его так
watchlist = models.BooleanField(default=False)
Сделав это, вы также сможете удалить это из вашего forms.py. В этом нет необходимости
watchlist = forms.BooleanField(required=False)
Просто используйте следующим образом
class CheckForm(ModelForm):
class Meta:
model = Watchlists
fields = ['watchlist']
Дополнительные вещи, которые нужно исправить на основе комментария @Sunderam Dubey
В вашей HTML-форме измените action="listing"
на action="{% url 'listing' %}"