Opened 2 years ago

Closed 17 months ago

#23387 closed Bug (fixed)

Error when saving inline formsets as new after a validation error.

Reported by: John R. Tipton Owned by: Adam Zapletal
Component: contrib.admin Version: master
Severity: Normal Keywords: admin formset validation base10
Cc: karnatijayadeep@… Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: yes UI/UX: no

Description (last modified by John R. Tipton)

This bug seems to have been around for a long time, as I've tried this from version 1.4 up.

While in the admin, if you have a form with inline formsets and you try to do a save as new, it works properly, unless there is a validation error. If you get a validation error, Django sends you through the add_view which no longer has the "Save as new" option. If you click save here, you will get the error below:

ValueError at /admin/drawings/sow/add/
invalid literal for int() with base 10:
Request Method: POST
Request URL: http://127.0.0.1:8000/admin/drawings/sow/add/
Django Version: 1.6.6.dev20140829183230
Exception Type: ValueError
Exception Value:
invalid literal for int() with base 10:

Exception Location: /Users/tip/Dropbox/websites/isotekrms/django/db/models/fields/init.py in get_prep_value, line 613
Python Executable: /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
Python Version: 2.7.6

I, have written a small patch that will check to see if the formset had validation errors and it was submitted as a save as new, it will set the context variable change=True which causes the "Save as new" button to show on the form again. Fixing the validation errors on the screen and pressing "Save as new" again will save the form properly.

Attachments (3)

formset_save_as_validation.patch (637 bytes) - added by John R. Tipton 2 years ago.
Patch
formset_save_as_validation.2.patch (666 bytes) - added by John R. Tipton 2 years ago.
Updated Patch.
formset_save_as_validation.3.patch (2.2 KB) - added by John R. Tipton 2 years ago.

Download all attachments as: .zip

Change History (20)

Changed 2 years ago by John R. Tipton

Patch

comment:1 Changed 2 years ago by John R. Tipton

Easy pickings: set
Needs documentation: unset
Needs tests: unset
Patch needs improvement: unset

Changed 2 years ago by John R. Tipton

Updated Patch.

comment:2 Changed 2 years ago by John R. Tipton

Description: modified (diff)

comment:3 Changed 2 years ago by Tim Graham

Needs tests: set
Triage Stage: UnreviewedAccepted

The patch also requires tests.

comment:4 Changed 2 years ago by Raúl Cumplido

Owner: changed from nobody to Raúl Cumplido
Status: newassigned

Changed 2 years ago by John R. Tipton

comment:5 Changed 2 years ago by John R. Tipton

Updated patch to hide "Save" and "Save and Continue" buttons after a validation error when try to Save as New.

If you try to Save as New and get a validation error, you must hit Save as New again or you will get the previously mentioned error.

comment:6 Changed 22 months ago by Raúl Cumplido

Owner: Raúl Cumplido deleted
Status: assignednew

comment:7 Changed 22 months ago by Jayadeep Karnati

Cc: karnatijayadeep@… added
Owner: set to Jayadeep Karnati
Status: newassigned
Version: 1.6master

The bug is reproducible in master version.

comment:8 Changed 19 months ago by Tino de Bruijn

Owner: changed from Jayadeep Karnati to Tino de Bruijn

comment:9 Changed 19 months ago by Tino de Bruijn

There is a problem with "Save as new" and validation errors in general. When you click "Save as new" and a validation error is raised, the ModelAdmin.add_view is returned, which does not include the "Save as new" button, but the other save buttons. The url is still the change url of the original object. This is confusing, as all the normal save buttons work as "Save as new" buttons now.

I would suggest that in that case, we should only show the "Save as new" button, and hide the others, as was proposed earlier in this patch.

If we would have to go in the direction to keep the other save buttons (and the "Save as new" button, all with correct functionality), the fix for the underlying issue with the inline formsets is not easy. You would have to validate both the object and it's inline instances (https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1367), and if either fails, reset the inline instances to instances where save_as_new is False.

comment:10 Changed 19 months ago by Tino de Bruijn

Needs tests: unset

All right, created a pull request in the direction that the original author took: https://github.com/django/django/pull/4265

comment:11 Changed 19 months ago by Tim Graham

Patch needs improvement: set

PR reviewed.

comment:12 Changed 18 months ago by Adam Zapletal

tino, I'd be happy to address Tim's comments on your pull request and finish the ticket if you don't have the time right now.

comment:13 Changed 17 months ago by Adam Zapletal

Owner: changed from Tino de Bruijn to Adam Zapletal

comment:14 Changed 17 months ago by Adam Zapletal

I submitted a new pull request that addresses Tim's comments: https://github.com/django/django/pull/4559

comment:15 Changed 17 months ago by Tim Graham

Patch needs improvement: unset

comment:16 Changed 17 months ago by Tim Graham

Triage Stage: AcceptedReady for checkin

comment:17 Changed 17 months ago by Tim Graham <timograham@…>

Resolution: fixed
Status: assignedclosed

In 0894643e:

Fixed #23387 -- Kept "Save as new" button after validation errors in admin.

When "Save as new" is chosen and errors occur, only show the "Save as new"
button and not the other save buttons.

Thanks to Tino de Bruijn for doing the real work on this fix.

Note: See TracTickets for help on using tickets.
Back to Top