Skip to content

Commit e60b389

Browse files
beryczboxed
authored andcommitted
use create_or_edit_object_redirect in save_nested_forms + allow redirect_to as a callable
1 parent 90eab2b commit e60b389

2 files changed

Lines changed: 28 additions & 5 deletions

File tree

iommi/form.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -238,10 +238,12 @@ class CallbackInvokingFailed(Exception):
238238

239239
request.method = 'GET'
240240

241-
redirect_to = form.extra.get('redirect_to', lambda **_: request.POST.get('next', '.'))
242-
target = form.invoke_callback(redirect_to)
243-
assert isinstance(target, str), 'redirect_to must return a str'
244-
return HttpResponseRedirect(target)
241+
return create_or_edit_object_redirect(
242+
is_create=False,
243+
redirect_to=form.extra.get('redirect_to', lambda **_: request.POST.get('next', '.')),
244+
redirect=form.extra.get('redirect', lambda redirect_to, **_: HttpResponseRedirect(redirect_to)),
245+
form=form,
246+
)
245247

246248

247249
def create_or_edit_object__post_handler(*, form, is_create=None, **_):
@@ -1522,9 +1524,11 @@ def is_django_promise_with_string_proxy(redirect_to):
15221524

15231525

15241526
def create_or_edit_object_redirect(is_create, redirect_to, redirect, form):
1527+
if callable(redirect_to):
1528+
redirect_to = form.invoke_callback(redirect_to)
15251529
assert (
15261530
redirect_to is None or isinstance(redirect_to, str) or is_django_promise_with_string_proxy(redirect_to)
1527-
), 'redirect_to must be a str'
1531+
), 'redirect_to must be a str or callable'
15281532
if redirect_to is None:
15291533
if is_create:
15301534
redirect_to = "../"

iommi/form__tests.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3927,6 +3927,25 @@ def test_save_nested_forms():
39273927
assert not form.get_errors()
39283928

39293929

3930+
@pytest.mark.django_db
3931+
def test_save_nested_forms_redirect():
3932+
black_sabbath = Artist.objects.create(name='Black Sabbath')
3933+
Album.objects.create(name='Heaven & Hell', artist=black_sabbath, year=1980)
3934+
3935+
form = Form(
3936+
fields=dict(
3937+
create_form=Form.create(auto__model=Artist),
3938+
edit_table=EditTable(auto__model=Album),
3939+
),
3940+
actions__submit__post_handler = save_nested_forms,
3941+
extra__redirect_to=lambda **_: '../foo',
3942+
)
3943+
3944+
response = form.bind(request=req('POST', **{'-submit': ''})).render_to_response()
3945+
assert response.status_code == 302
3946+
assert response['Location'] == '../foo'
3947+
3948+
39303949
@pytest.mark.django_db
39313950
def test_nested_forms_abort_save_on_fail():
39323951
dark_funeral = Artist.objects.create(name='Dark Funeral')

0 commit comments

Comments
 (0)