[4.0.x] Fixed #33155 -- Made ModelChoiceIteratorValue instances hashable.

Backport of 7b8beeee3d from main
This commit is contained in:
Aljaž Košir 2021-09-30 12:07:50 +02:00 committed by Mariusz Felisiak
parent 93a42d43a6
commit 0a49276065
3 changed files with 11 additions and 1 deletions

View File

@ -54,6 +54,7 @@ answer newbie questions, and generally made Django that much better:
Alexey Boriskin <alex@boriskin.me>
Alexey Tsivunin <most-208@yandex.ru>
Ali Vakilzade <ali@vakilzade.com>
Aljaž Košir <aljazkosir5@gmail.com>
Aljosa Mohorovic <aljosa.mohorovic@gmail.com>
Amit Chakradeo <https://amit.chakradeo.net/>
Amit Ramon <amit.ramon@gmail.com>

View File

@ -1166,6 +1166,9 @@ class ModelChoiceIteratorValue:
def __str__(self):
return str(self.value)
def __hash__(self):
return hash(self.value)
def __eq__(self, other):
if isinstance(other, ModelChoiceIteratorValue):
other = other.value

View File

@ -2,7 +2,7 @@ import datetime
from django import forms
from django.core.exceptions import ValidationError
from django.forms.models import ModelChoiceIterator
from django.forms.models import ModelChoiceIterator, ModelChoiceIteratorValue
from django.forms.widgets import CheckboxSelectMultiple
from django.template import Context, Template
from django.test import TestCase
@ -341,6 +341,12 @@ class ModelChoiceFieldTests(TestCase):
</div>""" % (self.c1.pk, self.c2.pk, self.c3.pk),
)
def test_choice_value_hash(self):
value_1 = ModelChoiceIteratorValue(self.c1.pk, self.c1)
value_2 = ModelChoiceIteratorValue(self.c2.pk, self.c2)
self.assertEqual(hash(value_1), hash(ModelChoiceIteratorValue(self.c1.pk, None)))
self.assertNotEqual(hash(value_1), hash(value_2))
def test_choices_not_fetched_when_not_rendering(self):
with self.assertNumQueries(1):
field = forms.ModelChoiceField(Category.objects.order_by('-name'))