Skip to content

Commit bd4cfe1

Browse files
committed
add extra_forms arg
1 parent eff5bb7 commit bd4cfe1

File tree

6 files changed

+87
-10
lines changed

6 files changed

+87
-10
lines changed

django_mongodb_backend/fields/embedded_model_array.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@ def deconstruct(self):
1616
name, path, args, kwargs = super().deconstruct()
1717
if path == "django_mongodb_backend.fields.embedded_model_array.EmbeddedModelArrayField":
1818
path = "django_mongodb_backend.fields.EmbeddedModelArrayField"
19-
kwargs.update(
20-
{
21-
"embedded_model": self.embedded_model,
22-
}
23-
)
19+
kwargs["embedded_model"] = self.embedded_model
2420
del kwargs["base_field"]
2521
return name, path, args, kwargs
2622

django_mongodb_backend/forms/fields/embedded_model_array.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ def models_to_dicts(models):
1414

1515

1616
class EmbeddedModelArrayField(forms.Field):
17-
def __init__(self, model, prefix, max_num=None, *args, **kwargs):
17+
def __init__(self, model, prefix, max_num=None, extra_forms=3, **kwargs):
1818
self.model = model
1919
self.prefix = prefix
2020
self.formset = formset_factory(
2121
form=modelform_factory(model, fields="__all__"),
2222
can_delete=True,
2323
max_num=max_num,
24-
extra=3,
24+
extra=extra_forms,
2525
validate_max=True,
2626
)
2727
kwargs["widget"] = EmbeddedModelArrayWidget()
28-
super().__init__(*args, **kwargs)
28+
super().__init__(**kwargs)
2929

3030
def clean(self, value):
3131
if not value:

docs/source/ref/forms.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Some MongoDB-specific fields are available in ``django_mongodb_backend.forms``.
2626
``EmbeddedModelArrayField``
2727
---------------------------
2828

29-
.. class:: EmbeddedModelArrayField(model, prefix, max_num=None, **kwargs)
29+
.. class:: EmbeddedModelArrayField(model, prefix, max_num=None, extra_forms=3, **kwargs)
3030

3131
.. versionadded:: 5.2.0b1
3232

@@ -48,6 +48,11 @@ Some MongoDB-specific fields are available in ``django_mongodb_backend.forms``.
4848
This is an optional argument which validates that the array does not
4949
exceed the stated length.
5050

51+
.. attribute:: extra_forms
52+
53+
This argument specifies the number of blank forms that will be
54+
rendered by the formset.
55+
5156
``ObjectIdField``
5257
-----------------
5358

docs/source/ref/models/fields.rst

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,8 @@ See :doc:`/topics/embedded-models` for more details and examples.
275275

276276
.. versionadded:: 5.2.0b1
277277

278-
Stores a list of models of type ``embedded_model``.
278+
Similar to :class:`EmbeddedModelField`, but stores a list of models of type
279+
``embedded_model`` rather than a single instance.
279280

280281
.. attribute:: embedded_model
281282

@@ -289,6 +290,11 @@ See :doc:`/topics/embedded-models` for more details and examples.
289290
If passed, the array will have a maximum size as specified, validated
290291
by forms and model validation, but not enforced by the database.
291292

293+
.. admonition:: Migrations support is limited
294+
295+
As described above for :class:`EmbeddedModelField`,
296+
:djadmin:`makemigrations` does not yet detect changes to embedded models.
297+
292298
``ObjectIdAutoField``
293299
---------------------
294300

docs/source/releases/5.2.x.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ Django MongoDB Backend 5.2.x
77

88
*Unreleased*
99

10+
New features
11+
------------
12+
13+
- Added :class:`~.fields.EmbeddedModelArrayField` for storing data as an array
14+
of model instances.
15+
1016
Bug fixes
1117
---------
1218

tests/model_forms_/test_embedded_model_array.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from django.test import TestCase
22

3+
from django_mongodb_backend.forms import EmbeddedModelArrayField
4+
35
from .forms import MovieForm
46
from .models import Movie, Review
57

@@ -409,3 +411,65 @@ def test_rendering_initial(self):
409411
id="id_reviews-MIN_NUM_FORMS"><input type="hidden"
410412
name="reviews-MAX_NUM_FORMS" value="1000" id="id_reviews-MAX_NUM_FORMS">""",
411413
)
414+
415+
def test_extra_forms(self):
416+
"""The extra_forms argument specifies the number of extra forms."""
417+
418+
class ExtraMovieForm(MovieForm):
419+
reviews = EmbeddedModelArrayField(Review, prefix="reviews", extra_forms=2)
420+
421+
form = ExtraMovieForm()
422+
self.assertHTMLEqual(
423+
str(form.fields["reviews"].get_bound_field(form, "reviews")),
424+
"""
425+
<table>
426+
<tbody>
427+
<tr>
428+
<th><label for="id_reviews-0-title">Title:</label></th>
429+
<td>
430+
<input type="text" name="reviews-0-title" maxlength="255"
431+
id="id_reviews-0-title">
432+
</td>
433+
</tr>
434+
<tr>
435+
<th><label for="id_reviews-0-rating">Rating:</label></th>
436+
<td>
437+
<input type="number" name="reviews-0-rating" id="id_reviews-0-rating">
438+
</td>
439+
</tr>
440+
<tr>
441+
<th><label for="id_reviews-0-DELETE">Delete:</label></th>
442+
<td>
443+
<input type="checkbox" name="reviews-0-DELETE" id="id_reviews-0-DELETE">
444+
</td>
445+
</tr>
446+
</tbody>
447+
<tbody>
448+
<tr>
449+
<th><label for="id_reviews-1-title">Title:</label></th>
450+
<td>
451+
<input type="text" name="reviews-1-title" maxlength="255" id="id_reviews-1-title">
452+
</td>
453+
</tr>
454+
<tr>
455+
<th><label for="id_reviews-1-rating">Rating:</label></th>
456+
<td>
457+
<input type="number" name="reviews-1-rating" id="id_reviews-1-rating">
458+
</td>
459+
</tr>
460+
<tr>
461+
<th><label for="id_reviews-1-DELETE">Delete:</label></th>
462+
<td>
463+
<input type="checkbox" name="reviews-1-DELETE" id="id_reviews-1-DELETE">
464+
</td>
465+
</tr>
466+
</tbody>
467+
</table>
468+
<input type="hidden" name="reviews-TOTAL_FORMS" value="2"
469+
id="id_reviews-TOTAL_FORMS"><input type="hidden"
470+
name="reviews-INITIAL_FORMS" value="0"
471+
id="id_reviews-INITIAL_FORMS">
472+
<input type="hidden" name="reviews-MIN_NUM_FORMS" value="0"
473+
id="id_reviews-MIN_NUM_FORMS"><input type="hidden"
474+
name="reviews-MAX_NUM_FORMS" value="1000" id="id_reviews-MAX_NUM_FORMS">""",
475+
)

0 commit comments

Comments
 (0)