Opened 17 years ago
Closed 17 years ago
#6369 closed (duplicate)
ModelForm fields ordering when Meta.fields is set
Reported by: | Owned by: | nobody | |
---|---|---|---|
Component: | Forms | Version: | dev |
Severity: | Keywords: | ||
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | yes |
Needs tests: | yes | Patch needs improvement: | yes |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Field ordering is currently determined by the order the fields were originally defined in the model. However, if the user specifically defines the fields to use in Meta.fields, it's safe to assume that's the order the user wants the fields to be outputted in.
Right now, this is accomplished with:
class myForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(myForm, self).__init__(*args, **kwargs) self.fields.keyOrder = self.Meta.fields #This line should be unnecessary class Meta: model = myModel fields = ['field_3', 'field_2', 'field_9']
The new version would just be:
class myForm(forms.ModelForm): class Meta: model = myModel fields = ['field_3', 'field_2', 'field_9']
Attachments (4)
Change History (9)
by , 17 years ago
Attachment: | modelfield_order.diff added |
---|
comment:1 by , 17 years ago
Description: | modified (diff) |
---|---|
Needs documentation: | set |
Needs tests: | set |
Patch needs improvement: | set |
Triage Stage: | Unreviewed → Accepted |
comment:2 by , 17 years ago
We should put the fields in the correct order in the newforms/models.py
code.
by , 17 years ago
Attachment: | modelfield_order_2.diff added |
---|
comment:3 by , 17 years ago
As far as I'm aware, there's no way to change the order of a SortedDict other than directly editing keyOrder. I've added a new patch which checks to ensure the fields are in keyOrder before reassigning them. I'm not sure this is 100% necessary, though. If Meta.fields contains a field that isn't in the attrsbase_fields SortedDict, then the program is going to fail anyway.
Do you think the best approach is to put in a descriptive error message to raise, if Model.fields is incorrect?
by , 17 years ago
Attachment: | modelfield_order_3.diff added |
---|
ModelField fields ordering (now with error handling)
by , 17 years ago
Attachment: | modelfield_order_3.2.diff added |
---|
ModelField fields ordering (now with error handling)
comment:4 by , 17 years ago
How about performing a set.difference
between opts.fields
and keyOrder
? This way, the error message could return all of the erroneous fields instead of just the first one.
comment:5 by , 17 years ago
Resolution: | → duplicate |
---|---|
Status: | new → closed |
Duplicate of #5986, which has several proposals and recent activity.
Sounds like the right thing to do. It's even a TODO in the code comments :)
As far as the patch goes, assigning directly to
keyOrder
is not a good idea. IMO,keyOrder
looks like it should be a private attribute. Anyway, by blindly assigning tokeyOrder
without checking to see if those keys exist in theSortedDict
would cause bad things to happen.