@@ -38,11 +38,28 @@ class ChoiceOptionModel(models.Model):
38
38
Can't reuse ChoiceModel because error_message tests require that it have no instances."""
39
39
name = models .CharField (max_length = 10 )
40
40
41
+ class Meta :
42
+ ordering = ('name' ,)
43
+
44
+ def __unicode__ (self ):
45
+ return u'ChoiceOption %d' % self .pk
46
+
41
47
class ChoiceFieldModel (models .Model ):
42
48
"""Model with ForeignKey to another model, for testing ModelForm
43
49
generation with ModelChoiceField."""
44
50
choice = models .ForeignKey (ChoiceOptionModel , blank = False ,
45
- default = lambda : ChoiceOptionModel .objects .all ()[0 ])
51
+ default = lambda : ChoiceOptionModel .objects .get (name = 'default' ))
52
+ choice_int = models .ForeignKey (ChoiceOptionModel , blank = False , related_name = 'choice_int' ,
53
+ default = lambda : 1 )
54
+
55
+ multi_choice = models .ManyToManyField (ChoiceOptionModel , blank = False , related_name = 'multi_choice' ,
56
+ default = lambda : ChoiceOptionModel .objects .filter (name = 'default' ))
57
+ multi_choice_int = models .ManyToManyField (ChoiceOptionModel , blank = False , related_name = 'multi_choice_int' ,
58
+ default = lambda : [1 ])
59
+
60
+ class ChoiceFieldForm (django_forms .ModelForm ):
61
+ class Meta :
62
+ model = ChoiceFieldModel
46
63
47
64
class FileModel (models .Model ):
48
65
file = models .FileField (storage = temp_storage , upload_to = 'tests' )
@@ -74,6 +91,74 @@ def test_choices_not_fetched_when_not_rendering(self):
74
91
# only one query is required to pull the model from DB
75
92
self .assertEqual (initial_queries + 1 , len (connection .queries ))
76
93
94
+ class ModelFormCallableModelDefault (TestCase ):
95
+ def test_no_empty_option (self ):
96
+ "If a model's ForeignKey has blank=False and a default, no empty option is created (Refs #10792)."
97
+ option = ChoiceOptionModel .objects .create (name = 'default' )
98
+
99
+ choices = list (ChoiceFieldForm ().fields ['choice' ].choices )
100
+ self .assertEquals (len (choices ), 1 )
101
+ self .assertEquals (choices [0 ], (option .pk , unicode (option )))
102
+
103
+ def test_callable_initial_value (self ):
104
+ "The initial value for a callable default returning a queryset is the pk (refs #13769)"
105
+ obj1 = ChoiceOptionModel .objects .create (id = 1 , name = 'default' )
106
+ obj2 = ChoiceOptionModel .objects .create (id = 2 , name = 'option 2' )
107
+ obj3 = ChoiceOptionModel .objects .create (id = 3 , name = 'option 3' )
108
+ self .assertEquals (ChoiceFieldForm ().as_p (), """<p><label for="id_choice">Choice:</label> <select name="choice" id="id_choice">
109
+ <option value="1" selected="selected">ChoiceOption 1</option>
110
+ <option value="2">ChoiceOption 2</option>
111
+ <option value="3">ChoiceOption 3</option>
112
+ </select><input type="hidden" name="initial-choice" value="1" id="initial-id_choice" /></p>
113
+ <p><label for="id_choice_int">Choice int:</label> <select name="choice_int" id="id_choice_int">
114
+ <option value="1" selected="selected">ChoiceOption 1</option>
115
+ <option value="2">ChoiceOption 2</option>
116
+ <option value="3">ChoiceOption 3</option>
117
+ </select><input type="hidden" name="initial-choice_int" value="1" id="initial-id_choice_int" /></p>
118
+ <p><label for="id_multi_choice">Multi choice:</label> <select multiple="multiple" name="multi_choice" id="id_multi_choice">
119
+ <option value="1" selected="selected">ChoiceOption 1</option>
120
+ <option value="2">ChoiceOption 2</option>
121
+ <option value="3">ChoiceOption 3</option>
122
+ </select><input type="hidden" name="initial-multi_choice" value="1" id="initial-id_multi_choice_0" /> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>
123
+ <p><label for="id_multi_choice_int">Multi choice int:</label> <select multiple="multiple" name="multi_choice_int" id="id_multi_choice_int">
124
+ <option value="1" selected="selected">ChoiceOption 1</option>
125
+ <option value="2">ChoiceOption 2</option>
126
+ <option value="3">ChoiceOption 3</option>
127
+ </select><input type="hidden" name="initial-multi_choice_int" value="1" id="initial-id_multi_choice_int_0" /> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>""" )
128
+
129
+ def test_initial_instance_value (self ):
130
+ "Initial instances for model fields may also be instances (refs #7287)"
131
+ obj1 = ChoiceOptionModel .objects .create (id = 1 , name = 'default' )
132
+ obj2 = ChoiceOptionModel .objects .create (id = 2 , name = 'option 2' )
133
+ obj3 = ChoiceOptionModel .objects .create (id = 3 , name = 'option 3' )
134
+ self .assertEquals (ChoiceFieldForm (initial = {
135
+ 'choice' : obj2 ,
136
+ 'choice_int' : obj2 ,
137
+ 'multi_choice' : [obj2 ,obj3 ],
138
+ 'multi_choice_int' : ChoiceOptionModel .objects .exclude (name = "default" ),
139
+ }).as_p (), """<p><label for="id_choice">Choice:</label> <select name="choice" id="id_choice">
140
+ <option value="1">ChoiceOption 1</option>
141
+ <option value="2" selected="selected">ChoiceOption 2</option>
142
+ <option value="3">ChoiceOption 3</option>
143
+ </select><input type="hidden" name="initial-choice" value="2" id="initial-id_choice" /></p>
144
+ <p><label for="id_choice_int">Choice int:</label> <select name="choice_int" id="id_choice_int">
145
+ <option value="1">ChoiceOption 1</option>
146
+ <option value="2" selected="selected">ChoiceOption 2</option>
147
+ <option value="3">ChoiceOption 3</option>
148
+ </select><input type="hidden" name="initial-choice_int" value="2" id="initial-id_choice_int" /></p>
149
+ <p><label for="id_multi_choice">Multi choice:</label> <select multiple="multiple" name="multi_choice" id="id_multi_choice">
150
+ <option value="1">ChoiceOption 1</option>
151
+ <option value="2" selected="selected">ChoiceOption 2</option>
152
+ <option value="3" selected="selected">ChoiceOption 3</option>
153
+ </select><input type="hidden" name="initial-multi_choice" value="2" id="initial-id_multi_choice_0" />
154
+ <input type="hidden" name="initial-multi_choice" value="3" id="initial-id_multi_choice_1" /> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>
155
+ <p><label for="id_multi_choice_int">Multi choice int:</label> <select multiple="multiple" name="multi_choice_int" id="id_multi_choice_int">
156
+ <option value="1">ChoiceOption 1</option>
157
+ <option value="2" selected="selected">ChoiceOption 2</option>
158
+ <option value="3" selected="selected">ChoiceOption 3</option>
159
+ </select><input type="hidden" name="initial-multi_choice_int" value="2" id="initial-id_multi_choice_int_0" />
160
+ <input type="hidden" name="initial-multi_choice_int" value="3" id="initial-id_multi_choice_int_1" /> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>""" )
161
+
77
162
78
163
__test__ = {'API_TESTS' : """
79
164
>>> from django.forms.models import ModelForm
@@ -155,18 +240,5 @@ def test_choices_not_fetched_when_not_rendering(self):
155
240
datetime.date(1999, 3, 2)
156
241
>>> shutil.rmtree(temp_storage_location)
157
242
158
- In a ModelForm with a ModelChoiceField, if the model's ForeignKey has blank=False and a default,
159
- no empty option is created (regression test for #10792).
160
-
161
- First we need at least one instance of ChoiceOptionModel:
162
-
163
- >>> ChoiceOptionModel.objects.create(name='default')
164
- <ChoiceOptionModel: ChoiceOptionModel object>
165
-
166
- >>> class ChoiceFieldForm(ModelForm):
167
- ... class Meta:
168
- ... model = ChoiceFieldModel
169
- >>> list(ChoiceFieldForm().fields['choice'].choices)
170
- [(1, u'ChoiceOptionModel object')]
171
243
172
244
""" }
0 commit comments