mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-30 05:24:00 +03:00
Display an empty label into related fields if it isn't required
This commit is contained in:
parent
a0e3c44c99
commit
392c8556ae
|
@ -8,6 +8,7 @@ from __future__ import unicode_literals
|
||||||
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
||||||
from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch
|
from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch
|
||||||
from django import forms
|
from django import forms
|
||||||
|
from django.db.models.fields import BLANK_CHOICE_DASH
|
||||||
from django.forms import widgets
|
from django.forms import widgets
|
||||||
from django.forms.models import ModelChoiceIterator
|
from django.forms.models import ModelChoiceIterator
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
@ -47,7 +48,7 @@ class RelatedField(WritableField):
|
||||||
DeprecationWarning, stacklevel=2)
|
DeprecationWarning, stacklevel=2)
|
||||||
kwargs['required'] = not kwargs.pop('null')
|
kwargs['required'] = not kwargs.pop('null')
|
||||||
|
|
||||||
self.queryset = kwargs.pop('queryset', None)
|
queryset = kwargs.pop('queryset', None)
|
||||||
self.many = kwargs.pop('many', self.many)
|
self.many = kwargs.pop('many', self.many)
|
||||||
if self.many:
|
if self.many:
|
||||||
self.widget = self.many_widget
|
self.widget = self.many_widget
|
||||||
|
@ -56,6 +57,11 @@ class RelatedField(WritableField):
|
||||||
kwargs['read_only'] = kwargs.pop('read_only', self.read_only)
|
kwargs['read_only'] = kwargs.pop('read_only', self.read_only)
|
||||||
super(RelatedField, self).__init__(*args, **kwargs)
|
super(RelatedField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
if not self.required:
|
||||||
|
self.empty_label = BLANK_CHOICE_DASH[0][1]
|
||||||
|
|
||||||
|
self.queryset = queryset
|
||||||
|
|
||||||
def initialize(self, parent, field_name):
|
def initialize(self, parent, field_name):
|
||||||
super(RelatedField, self).initialize(parent, field_name)
|
super(RelatedField, self).initialize(parent, field_name)
|
||||||
if self.queryset is None and not self.read_only:
|
if self.queryset is None and not self.read_only:
|
||||||
|
|
|
@ -1117,6 +1117,63 @@ class SerializerChoiceFields(TestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Regression tests for #675
|
||||||
|
class Ticket(models.Model):
|
||||||
|
assigned = models.ForeignKey(
|
||||||
|
Person, related_name='assigned_tickets')
|
||||||
|
reviewer = models.ForeignKey(
|
||||||
|
Person, blank=True, null=True, related_name='reviewed_tickets')
|
||||||
|
|
||||||
|
|
||||||
|
class SerializerRelatedChoicesTest(TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(SerializerRelatedChoicesTest, self).setUp()
|
||||||
|
|
||||||
|
class RelatedChoicesSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Ticket
|
||||||
|
fields = ('assigned', 'reviewer')
|
||||||
|
|
||||||
|
self.related_fields_serializer = RelatedChoicesSerializer
|
||||||
|
|
||||||
|
def test_empty_queryset_required(self):
|
||||||
|
serializer = self.related_fields_serializer()
|
||||||
|
self.assertEqual(serializer.fields['assigned'].queryset.count(), 0)
|
||||||
|
self.assertEqual(
|
||||||
|
[x for x in serializer.fields['assigned'].widget.choices],
|
||||||
|
[]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_empty_queryset_not_required(self):
|
||||||
|
serializer = self.related_fields_serializer()
|
||||||
|
self.assertEqual(serializer.fields['reviewer'].queryset.count(), 0)
|
||||||
|
self.assertEqual(
|
||||||
|
[x for x in serializer.fields['reviewer'].widget.choices],
|
||||||
|
[(u'', u'---------')]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_with_some_persons_required(self):
|
||||||
|
Person.objects.create(name="Lionel Messi")
|
||||||
|
Person.objects.create(name="Xavi Hernandez")
|
||||||
|
serializer = self.related_fields_serializer()
|
||||||
|
self.assertEqual(serializer.fields['assigned'].queryset.count(), 2)
|
||||||
|
self.assertEqual(
|
||||||
|
[x for x in serializer.fields['assigned'].widget.choices],
|
||||||
|
[(1, u'Person object - 1'), (2, u'Person object - 2')]
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_with_some_persons_not_required(self):
|
||||||
|
Person.objects.create(name="Lionel Messi")
|
||||||
|
Person.objects.create(name="Xavi Hernandez")
|
||||||
|
serializer = self.related_fields_serializer()
|
||||||
|
self.assertEqual(serializer.fields['reviewer'].queryset.count(), 2)
|
||||||
|
self.assertEqual(
|
||||||
|
[x for x in serializer.fields['reviewer'].widget.choices],
|
||||||
|
[(u'', u'---------'), (1, u'Person object - 1'), (2, u'Person object - 2')]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class DepthTest(TestCase):
|
class DepthTest(TestCase):
|
||||||
def test_implicit_nesting(self):
|
def test_implicit_nesting(self):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user