{% for variant in value %}
{{ variant.count_purple }}
{% endfor %}
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'],
code='password_mismatch',
)
return password2
ошибка не вылетает
else:
error = ''
<br>
{% if form.errors %}<br>
{% for field in form %}<br>
{% for error in field.errors %}<br>
<br>
{{ error|escape }}<br>
<br>
{% endfor %}<br>
{% endfor %}<br>
{% for error in form.non_field_errors %}<br>
<br>
{{ error|escape }}<br>
<br>
{% endfor %}<br>
{% endif %}<br>
С помощью js сначала делал, но понял, что не совсем удобно, если форма, которая ниже не прошла валидацию, то фильтры сбрасываются, я бы хотел, чтобы в GET параметре они сохранились, тем самым и фильтры на местах.
Для сравнения - есть процессор Intel. И больше никаких фирм MSI/ASUS/-Intel. Только Intel.
URL route '' uses parameter name 'id/' which isn't a valid Python identifier.
# urls
urlpatterns = [
path('', home, name='home'),
path('test/', test, name='test'),
path('<int:id>/', article, name='arcicl'),
]
# views.py (условно)
def home(request):
return HttpResponse('home')
def test(request):
return HttpResponse('test')
def article(request, id):
return HttpResponse(id)
<int:id>
<img src="domen.ru/{% static 'images/logo.jpg' %}" alt="" />
Насчет middleware не понял - зачем?
1. Если нужно периодически добавлять варианты:
Использовать транзитую таблицу:
Если расширение не планируется - вынести варианты в choises
В этом случае для подсчета голосов придется использавать Count внутри annotate()/agregate(). Но с этим уже сами разбирайтесь.