Fixed #33155 -- Made ModelChoiceIteratorValue instances hashable.

This commit is contained in:
Aljaž Košir 2021-09-30 12:07:50 +02:00 committed by GitHub
parent 903aaa35e5
commit 7b8beeee3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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'))