1 | Index: core/management/sql.py
|
---|
2 | ===================================================================
|
---|
3 | --- core/management/sql.py (revision 8138)
|
---|
4 | +++ core/management/sql.py (working copy)
|
---|
5 | @@ -54,7 +54,7 @@
|
---|
6 | for app in apps:
|
---|
7 | for model in models.get_models(app):
|
---|
8 | for f in model._meta.local_fields:
|
---|
9 | - if isinstance(f, models.AutoField):
|
---|
10 | + if isinstance(f, models.AutoField) or getattr(f, 'auto_field', False):
|
---|
11 | sequence_list.append({'table': model._meta.db_table, 'column': f.column})
|
---|
12 | break # Only one AutoField is allowed per model, so don't bother continuing.
|
---|
13 | Index: db/models/base.py
|
---|
14 | ===================================================================
|
---|
15 | --- db/models/base.py (revision 8138)
|
---|
16 | +++ db/models/base.py (working copy)
|
---|
17 | @@ -140,7 +140,7 @@
|
---|
18 | value.contribute_to_class(cls, name)
|
---|
19 | else:
|
---|
20 | setattr(cls, name, value)
|
---|
21 | -
|
---|
22 | +
|
---|
23 | def _prepare(cls):
|
---|
24 | """
|
---|
25 | Creates some methods once self._meta has been populated.
|
---|
26 | @@ -327,7 +327,7 @@
|
---|
27 | record_exists = False
|
---|
28 | if not pk_set or not record_exists:
|
---|
29 | if not pk_set:
|
---|
30 | - values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields if not isinstance(f, AutoField)]
|
---|
31 | + values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields if not isinstance(f, AutoField) and not getattr(f, 'auto_field', False)]
|
---|
32 | else:
|
---|
33 | values = [(f, f.get_db_prep_save(raw and getattr(self, f.attname) or f.pre_save(self, True))) for f in meta.local_fields]
|
---|
34 | Index: db/models/manipulators.py
|
---|
35 | ===================================================================
|
---|
36 | --- db/models/manipulators.py (revision 8138)
|
---|
37 | +++ db/models/manipulators.py (working copy)
|
---|
38 | @@ -179,7 +179,7 @@
|
---|
39 |
|
---|
40 | if f == related.field:
|
---|
41 | param = getattr(new_object, related.field.rel.get_related_field().attname)
|
---|
42 | - elif (not self.change) and isinstance(f, AutoField):
|
---|
43 | + elif (not self.change) and (isinstance(f, AutoField) or getattr(f, 'auto_field', False)):
|
---|
44 | param = None
|
---|
45 | elif self.change and (isinstance(f, FileField) or not child_follow.get(f.name, None)):
|
---|
46 | if old_rel_obj:
|
---|
47 | Index: db/models/fields/__init__.py
|
---|
48 | ===================================================================
|
---|
49 | --- db/models/fields/__init__.py (revision 8138)
|
---|
50 | +++ db/models/fields/__init__.py (working copy)
|
---|
51 | @@ -82,7 +82,7 @@
|
---|
52 | editable=True, serialize=True, unique_for_date=None,
|
---|
53 | unique_for_month=None, unique_for_year=None, validator_list=None,
|
---|
54 | choices=None, help_text='', db_column=None, db_tablespace=None,
|
---|
55 | - auto_created=False):
|
---|
56 | + auto_created=False, auto_field=False):
|
---|
57 | self.name = name
|
---|
58 | self.verbose_name = verbose_name
|
---|
59 | self.primary_key = primary_key
|
---|
60 | @@ -101,6 +101,7 @@
|
---|
61 | self._choices = choices or []
|
---|
62 | self.help_text = help_text
|
---|
63 | self.db_column = db_column
|
---|
64 | + self.auto_field = auto_field
|
---|
65 | self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE
|
---|
66 |
|
---|
67 | # Set db_index to True if the field has a relationship and doesn't explicitly set db_index.
|
---|
68 | @@ -199,6 +200,10 @@
|
---|
69 | cls._meta.add_field(self)
|
---|
70 | if self.choices:
|
---|
71 | setattr(cls, 'get_%s_display' % self.name, curry(cls._get_FIELD_display, field=self))
|
---|
72 | + if self.auto_field:
|
---|
73 | + assert not cls._meta.has_auto_field, "A model can't have more than one auto_field=True or AutoFields."
|
---|
74 | + cls._meta.has_auto_field = True
|
---|
75 | + cls._meta.auto_field = self
|
---|
76 |
|
---|
77 | def get_attname(self):
|
---|
78 | return self.name
|
---|
79 | @@ -337,7 +342,7 @@
|
---|
80 | # If this field is in a related context, check whether any other fields
|
---|
81 | # in the related object have core=True. If so, add a validator --
|
---|
82 | # RequiredIfOtherFieldsGiven -- to this FormField.
|
---|
83 | - if rel and not self.blank and not isinstance(self, AutoField) and not isinstance(self, FileField):
|
---|
84 | + if rel and not self.blank and not isinstance(self, FileField) and not self.auto_field:
|
---|
85 | # First, get the core fields, if any.
|
---|
86 | core_field_names = []
|
---|
87 | for f in opts.fields:
|
---|
88 | @@ -434,6 +439,8 @@
|
---|
89 |
|
---|
90 | def formfield(self, form_class=forms.CharField, **kwargs):
|
---|
91 | "Returns a django.forms.Field instance for this database Field."
|
---|
92 | + if self.auto_field:
|
---|
93 | + return None
|
---|
94 | defaults = {'required': not self.blank, 'label': capfirst(self.verbose_name), 'help_text': self.help_text}
|
---|
95 | if self.choices:
|
---|
96 | defaults['widget'] = forms.Select(choices=self.get_choices(include_blank=self.blank or not (self.has_default() or 'initial' in kwargs)))
|
---|
97 | @@ -451,6 +458,7 @@
|
---|
98 | def __init__(self, *args, **kwargs):
|
---|
99 | assert kwargs.get('primary_key', False) is True, "%ss must have primary_key=True." % self.__class__.__name__
|
---|
100 | kwargs['blank'] = True
|
---|
101 | + kwargs['auto_field'] = True
|
---|
102 | Field.__init__(self, *args, **kwargs)
|
---|
103 |
|
---|
104 | def to_python(self, value):
|
---|
105 | @@ -482,12 +490,6 @@
|
---|
106 | return None
|
---|
107 | return Field.get_manipulator_new_data(self, new_data, rel)
|
---|
108 |
|
---|
109 | - def contribute_to_class(self, cls, name):
|
---|
110 | - assert not cls._meta.has_auto_field, "A model can't have more than one AutoField."
|
---|
111 | - super(AutoField, self).contribute_to_class(cls, name)
|
---|
112 | - cls._meta.has_auto_field = True
|
---|
113 | - cls._meta.auto_field = self
|
---|
114 | -
|
---|
115 | def formfield(self, **kwargs):
|
---|
116 | return None
|
---|
117 | Index: forms/models.py
|
---|
118 | ===================================================================
|
---|
119 | --- forms/models.py (revision 8138)
|
---|
120 | +++ forms/models.py (working copy)
|
---|
121 | @@ -37,7 +37,7 @@
|
---|
122 | " validate." % (opts.object_name, fail_message))
|
---|
123 | cleaned_data = form.cleaned_data
|
---|
124 | for f in opts.fields:
|
---|
125 | - if not f.editable or isinstance(f, models.AutoField) \
|
---|
126 | + if not f.editable or isinstance(f, models.AutoField) or f.auto_field \
|
---|
127 | or not f.name in cleaned_data:
|
---|
128 | continue
|
---|
129 | if fields and f.name not in fields:
|
---|
130 | @@ -378,8 +378,9 @@
|
---|
131 |
|
---|
132 | def add_fields(self, form, index):
|
---|
133 | """Add a hidden field for the object's primary key."""
|
---|
134 | - self._pk_field_name = self.model._meta.pk.attname
|
---|
135 | - form.fields[self._pk_field_name] = IntegerField(required=False, widget=HiddenInput)
|
---|
136 | + if self.model._meta.has_auto_field:
|
---|
137 | + self._pk_field_name = self.model._meta.pk.attname
|
---|
138 | + form.fields[self._pk_field_name] = IntegerField(required=False, widget=HiddenInput)
|
---|
139 | super(BaseModelFormSet, self).add_fields(form, index)
|
---|
140 |
|
---|
141 | def modelformset_factory(model, form=ModelForm, formfield_callback=lambda f: f.formfield(),
|
---|
142 | Index: core/management/sql.py
|
---|
143 | ===================================================================
|
---|
144 | --- core/management/sql.py (revision 8138)
|
---|
145 | +++ core/management/sql.py (working copy)
|
---|
146 | @@ -54,7 +54,7 @@
|
---|
147 | for app in apps:
|
---|
148 | for model in models.get_models(app):
|
---|
149 | for f in model._meta.local_fields:
|
---|
150 | - if isinstance(f, models.AutoField):
|
---|
151 | + if isinstance(f, models.AutoField) or getattr(f, 'auto_field', False):
|
---|
152 | sequence_list.append({'table': model._meta.db_table, 'column': f.column})
|
---|
153 | break # Only one AutoField is allowed per model, so don't bother continuing.
|
---|