summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJason Pellerin <jpellerin@gmail.com>2006-11-29 20:16:50 +0000
committerJason Pellerin <jpellerin@gmail.com>2006-11-29 20:16:50 +0000
commitf8217026f9618adb65ab2d517025e87b98ed2fbe (patch)
tree2ab846582343dc9b0894b0bdffa3fe04f590365b /django
parent9a01534370a272e59f2bb64251d1f46218a32516 (diff)
[multi-db] Merge trunk to [3850]. Some tests still failing.
git-svn-id: http://code.djangoproject.com/svn/django/branches/multiple-db-support@4142 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/conf/global_settings.py4
-rw-r--r--django/conf/locale/de/LC_MESSAGES/django.mobin37271 -> 37729 bytes
-rw-r--r--django/conf/locale/de/LC_MESSAGES/django.po49
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/django.mobin30798 -> 30798 bytes
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/django.po4
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mobin1513 -> 1505 bytes
-rw-r--r--django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po28
-rw-r--r--django/contrib/auth/decorators.py4
-rw-r--r--django/contrib/auth/forms.py11
-rw-r--r--django/core/management.py2
-rw-r--r--django/core/servers/basehttp.py2
-rw-r--r--django/core/validators.py4
-rw-r--r--django/db/backends/ansi/sql.py2
-rw-r--r--django/db/models/fields/__init__.py4
-rw-r--r--django/db/models/fields/related.py2
-rw-r--r--django/db/models/manipulators.py4
-rw-r--r--django/db/models/query.py14
-rw-r--r--django/forms/__init__.py3
-rw-r--r--django/middleware/common.py4
-rw-r--r--django/views/generic/create_update.py6
20 files changed, 85 insertions, 62 deletions
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index 920ff9657c..cc168034ce 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -277,8 +277,8 @@ CACHE_MIDDLEWARE_KEY_PREFIX = ''
COMMENTS_ALLOW_PROFANITIES = False
# The profanities that will trigger a validation error in the
-# 'hasNoProfanities' validator. All of these should be in lower-case.
-PROFANITIES_LIST = ['asshat', 'asshead', 'asshole', 'cunt', 'fuck', 'gook', 'nigger', 'shit']
+# 'hasNoProfanities' validator. All of these should be in lowercase.
+PROFANITIES_LIST = ('asshat', 'asshead', 'asshole', 'cunt', 'fuck', 'gook', 'nigger', 'shit')
# The group ID that designates which users are banned.
# Set to None if you're not using it.
diff --git a/django/conf/locale/de/LC_MESSAGES/django.mo b/django/conf/locale/de/LC_MESSAGES/django.mo
index 768c859ad2..aef68099d3 100644
--- a/django/conf/locale/de/LC_MESSAGES/django.mo
+++ b/django/conf/locale/de/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/de/LC_MESSAGES/django.po b/django/conf/locale/de/LC_MESSAGES/django.po
index 2da39e2253..614ea69247 100644
--- a/django/conf/locale/de/LC_MESSAGES/django.po
+++ b/django/conf/locale/de/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Django 1.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-09-25 15:39+0200\n"
+"POT-Creation-Date: 2006-09-25 16:04+0200\n"
"PO-Revision-Date: 2005-10-08 00:03+0200\n"
"Last-Translator: Georg Bauer <gb@bofh.ms>\n"
"MIME-Version: 1.0\n"
@@ -586,6 +586,7 @@ msgid "view:"
msgstr "Ansicht:"
#: contrib/admin/views/doc.py:164
+#, python-format
msgid "App %r not found"
msgstr "Anwendung %r nicht gefunden"
@@ -826,6 +827,7 @@ msgid "Models available in the %(name)s application."
msgstr "Modelle, die in der Anwendung %(name)s vorhanden sind."
#: contrib/admin/templates/admin/index.html:18
+#, python-format
msgid "%(name)s"
msgstr "%(name)s"
@@ -873,6 +875,7 @@ msgid "Delete"
msgstr "Lschen"
#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
msgid ""
"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
"related objects, but your account doesn't have permission to delete the "
@@ -883,18 +886,20 @@ msgstr ""
"folgenden abhngigen Daten zu lschen:"
#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
msgid ""
"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
"All of the following related items will be deleted:"
msgstr ""
-"Sind Sie sicher, das Sie %(object_name)s \"%(escaped_object)s\" lschen wollen? Es "
-"werden zustzlich die folgenden abhngigen Daten mit gelscht:"
+"Sind Sie sicher, das Sie %(object_name)s \"%(escaped_object)s\" lschen "
+"wollen? Es werden zustzlich die folgenden abhngigen Daten mit gelscht:"
#: contrib/admin/templates/admin/delete_confirmation.html:26
msgid "Yes, I'm sure"
msgstr "Ja, ich bin sicher"
#: contrib/admin/templates/admin/filter.html:2
+#, python-format
msgid " By %(filter_title)s "
msgstr " Nach %(filter_title)s "
@@ -962,9 +967,9 @@ msgid ""
"database tables have been created, and make sure the database is readable by "
"the appropriate user."
msgstr ""
-"Irgendetwas ist falsch mit der Datenbankkonfiguration. Bitte sicherstellen, das "
-"die richtigen Datenbanktabellen angelegt wurden und bitte sicherstellen, das die "
-"Datenbank vom verwendeten Datenbankbenutzer auch lesbar ist."
+"Irgendetwas ist falsch mit der Datenbankkonfiguration. Bitte sicherstellen, "
+"das die richtigen Datenbanktabellen angelegt wurden und bitte sicherstellen, "
+"das die Datenbank vom verwendeten Datenbankbenutzer auch lesbar ist."
#: contrib/admin/templates/admin/auth/user/add_form.html:6
msgid ""
@@ -1252,8 +1257,8 @@ msgid ""
"Example: 'flatpages/contact_page.html'. If this isn't provided, the system "
"will use 'flatpages/default.html'."
msgstr ""
-"Beispiel: 'flatpages/contact_page.html'. Wenn dieses Feld nicht gefllt ist, wird "
-"'flatpages/default.html' als Standard gewhlt."
+"Beispiel: 'flatpages/contact_page.html'. Wenn dieses Feld nicht gefllt ist, "
+"wird 'flatpages/default.html' als Standard gewhlt."
#: contrib/flatpages/models.py:14
msgid "registration required"
@@ -1350,8 +1355,8 @@ msgid ""
"Designates whether this user can log into the Django admin. Unselect this "
"instead of deleting accounts."
msgstr ""
-"Gibt an, ob der Benutzer sich an der Administrationsseite anmelden kann. Anstelle "
-"Benutzer zu lschen, kann das hier auch einfach abgeschaltet werden."
+"Gibt an, ob der Benutzer sich an der Administrationsseite anmelden kann. "
+"Anstelle Benutzer zu lschen, kann das hier auch einfach abgeschaltet werden."
#: contrib/auth/models.py:97
msgid "superuser status"
@@ -1425,6 +1430,22 @@ msgstr ""
msgid "This account is inactive."
msgstr "Dieser Benutzer ist inaktiv."
+#: contrib/auth/forms.py:84
+msgid ""
+"That e-mail address doesn't have an associated user acount. Are you sure "
+"you've registered?"
+msgstr ""
+"Die Email-Adresse hat keinen Benutzer zugeordnet. Sicher, das die Adresse "
+"hier angemeldet ist?"
+
+#: contrib/auth/forms.py:116
+msgid "The two 'new password' fields didn't match."
+msgstr "Die zwei Passwrter sind nicht gleich."
+
+#: contrib/auth/forms.py:123
+msgid "Your old password was entered incorrectly. Please enter it again."
+msgstr "Das alte Passwort war falsch. Bitte neu eingeben."
+
#: contrib/contenttypes/models.py:20
msgid "python model class name"
msgstr "Python Model-Klassenname"
@@ -1872,6 +1893,7 @@ msgid "Year must be 1900 or later."
msgstr "Das Jahr muss 1900 oder spter sein."
#: core/validators.py:142
+#, python-format
msgid "Invalid date: %s."
msgstr "Ungltiges Datum: %s"
@@ -1895,7 +1917,8 @@ msgstr "Bitte eine gltige eMail-Adresse eingeben"
#: core/validators.py:172 core/validators.py:401 forms/__init__.py:661
msgid "No file was submitted. Check the encoding type on the form."
-msgstr "Es wurde keine Datei geschickt. Eventuell ist das Formular-Encoding falsch."
+msgstr ""
+"Es wurde keine Datei geschickt. Eventuell ist das Formular-Encoding falsch."
#: core/validators.py:176
msgid ""
@@ -2007,6 +2030,7 @@ msgstr[0] "Bitte eine gltige Dezimalzahl mit maximal %s Ziffer eingeben."
msgstr[1] "Bitte eine gltige Dezimalzahl mit maximal %s Ziffern eingeben."
#: core/validators.py:381
+#, python-format
msgid ""
"Please enter a valid decimal number with a whole part of at most %s digit."
msgid_plural ""
@@ -2111,14 +2135,17 @@ msgstr ""
"beginnt mit \"%(start)s\"."
#: views/generic/create_update.py:43
+#, python-format
msgid "The %(verbose_name)s was created successfully."
msgstr "%(verbose_name)s wurde erfolgreich angelegt."
#: views/generic/create_update.py:117
+#, python-format
msgid "The %(verbose_name)s was updated successfully."
msgstr "%(verbose_name)s wurde erfolgreich aktualisiert."
#: views/generic/create_update.py:184
+#, python-format
msgid "The %(verbose_name)s was deleted."
msgstr "%(verbose_name)s wurde gelscht"
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
index 9fc04b9395..0d6bf90c0e 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
Binary files differ
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/django.po b/django/conf/locale/zh_CN/LC_MESSAGES/django.po
index 7718514299..2552b677bd 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/django.po
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: django v1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-05-16 10:10+0200\n"
-"PO-Revision-Date: 2006-05-17 13:47+0800\n"
+"PO-Revision-Date: 2006-09-01 22:05+0800\n"
"Last-Translator: limodou <limodou@gmail.com>\n"
"Language-Team: Simplified Chinese <limodou@gmail.com>\n"
"MIME-Version: 1.0\n"
@@ -1167,7 +1167,7 @@ msgstr "个人信息"
#: contrib/auth/models.py:77
msgid "Permissions"
-msgstr "许可"
+msgstr "权限"
#: contrib/auth/models.py:78
msgid "Important dates"
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo b/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
index 983a8a7154..ec7580a862 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po b/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
index 1e9e7dbeb7..610e61d17a 100644
--- a/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
+++ b/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
@@ -3,22 +3,21 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
-#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: Django 0.95\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-03-21 18:43+0800\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <max@exoweb.net>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"PO-Revision-Date: 2006-09-25 08:35+0800\n"
+"Last-Translator: limodou <limodou@gmail.com>\n"
+"Language-Team: limodou <limodou@gmail.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: contrib/admin/media/js/SelectFilter2.js:33
msgid "Available %s"
-msgstr "可行 %s"
+msgstr "可用 %s"
#: contrib/admin/media/js/SelectFilter2.js:41
msgid "Choose all"
@@ -30,34 +29,32 @@ msgstr "增加"
#: contrib/admin/media/js/SelectFilter2.js:48
msgid "Remove"
-msgstr "移出"
+msgstr "删除"
#: contrib/admin/media/js/SelectFilter2.js:53
msgid "Chosen %s"
-msgstr "选择 %s"
+msgstr "选中的 %s"
#: contrib/admin/media/js/SelectFilter2.js:54
msgid "Select your choice(s) and click "
-msgstr "挑选你的选择并且点击 "
+msgstr "选择并点击 "
#: contrib/admin/media/js/SelectFilter2.js:59
msgid "Clear all"
-msgstr "清除所有"
+msgstr "清除全部"
#: contrib/admin/media/js/dateparse.js:32
#: contrib/admin/media/js/calendar.js:24
-msgid ""
-"January February March April May June July August September October November "
-"December"
+msgid "January February March April May June July August September October November December"
msgstr "一月 二月 三月 四月 五月 六月 六月 七月 八月 九月 十月 十一月 十二月"
#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
-msgstr "星期天 星期一 星期二 星期三 星期四 星期五 星期六"
+msgstr "星期日 星期一 星期二 星期三 星期四 星期五 星期六"
#: contrib/admin/media/js/calendar.js:25
msgid "S M T W T F S"
-msgstr "日 月 火 水 木 金 土"
+msgstr "日 一 二 三 四 五 六"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
@@ -105,3 +102,4 @@ msgstr "昨天"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
msgid "Tomorrow"
msgstr "明天"
+
diff --git a/django/contrib/auth/decorators.py b/django/contrib/auth/decorators.py
index 8164d8314e..37e948f8fe 100644
--- a/django/contrib/auth/decorators.py
+++ b/django/contrib/auth/decorators.py
@@ -29,8 +29,8 @@ login_required.__doc__ = (
def permission_required(perm, login_url=LOGIN_URL):
"""
- Decorator for views that checks if a user has a particular permission
- enabled, redirectiing to the log-in page if necessary.
+ Decorator for views that checks whether a user has a particular permission
+ enabled, redirecting to the log-in page if necessary.
"""
return user_passes_test(lambda u: u.has_perm(perm), login_url=login_url)
diff --git a/django/contrib/auth/forms.py b/django/contrib/auth/forms.py
index ad8d423ebf..6fd583dcc0 100644
--- a/django/contrib/auth/forms.py
+++ b/django/contrib/auth/forms.py
@@ -4,6 +4,7 @@ from django.contrib.sites.models import Site
from django.template import Context, loader
from django.core import validators
from django import forms
+from django.utils.translation import gettext_lazy as _
class UserCreationForm(forms.Manipulator):
"A form that creates a user, with no privileges, from the given username and password."
@@ -13,7 +14,7 @@ class UserCreationForm(forms.Manipulator):
validator_list=[validators.isAlphaNumeric, self.isValidUsername]),
forms.PasswordField(field_name='password1', length=30, maxlength=60, is_required=True),
forms.PasswordField(field_name='password2', length=30, maxlength=60, is_required=True,
- validator_list=[validators.AlwaysMatchesOtherField('password1', "The two password fields didn't match.")]),
+ validator_list=[validators.AlwaysMatchesOtherField('password1', _("The two password fields didn't match."))]),
)
def isValidUsername(self, field_data, all_data):
@@ -21,7 +22,7 @@ class UserCreationForm(forms.Manipulator):
User.objects.get(username=field_data)
except User.DoesNotExist:
return
- raise validators.ValidationError, 'A user with that username already exists.'
+ raise validators.ValidationError, _('A user with that username already exists.')
def save(self, new_data):
"Creates the user."
@@ -81,7 +82,7 @@ class PasswordResetForm(forms.Manipulator):
try:
self.user_cache = User.objects.get(email__iexact=new_data)
except User.DoesNotExist:
- raise validators.ValidationError, "That e-mail address doesn't have an associated user acount. Are you sure you've registered?"
+ raise validators.ValidationError, _("That e-mail address doesn't have an associated user acount. Are you sure you've registered?")
def save(self, domain_override=None, email_template_name='registration/password_reset_email.html'):
"Calculates a new password randomly and sends it to the user"
@@ -113,14 +114,14 @@ class PasswordChangeForm(forms.Manipulator):
forms.PasswordField(field_name="old_password", length=30, maxlength=30, is_required=True,
validator_list=[self.isValidOldPassword]),
forms.PasswordField(field_name="new_password1", length=30, maxlength=30, is_required=True,
- validator_list=[validators.AlwaysMatchesOtherField('new_password2', "The two 'new password' fields didn't match.")]),
+ validator_list=[validators.AlwaysMatchesOtherField('new_password2', _("The two 'new password' fields didn't match."))]),
forms.PasswordField(field_name="new_password2", length=30, maxlength=30, is_required=True),
)
def isValidOldPassword(self, new_data, all_data):
"Validates that the old_password field is correct."
if not self.user.check_password(new_data):
- raise validators.ValidationError, "Your old password was entered incorrectly. Please enter it again."
+ raise validators.ValidationError, _("Your old password was entered incorrectly. Please enter it again.")
def save(self, new_data):
"Saves the new password."
diff --git a/django/core/management.py b/django/core/management.py
index bd162a1e8d..09db6e5c01 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -1128,7 +1128,7 @@ def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
parser.add_option('--verbosity', action='store', dest='verbosity', default='2',
type='choice', choices=['0', '1', '2'],
help='Verbosity level; 0=minimal output, 1=normal output, 2=all output'),
- parser.add_option('--adminmedia', dest='admin_media_path', default='', help='Lets you manually specify the directory to serve admin media from when running the development server.'),
+ parser.add_option('--adminmedia', dest='admin_media_path', default='', help='Specifies the directory from which to serve admin media for runserver.'),
options, args = parser.parse_args(argv[1:])
diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py
index fe534d5da0..a16b8b675a 100644
--- a/django/core/servers/basehttp.py
+++ b/django/core/servers/basehttp.py
@@ -594,7 +594,7 @@ class AdminMediaHandler(object):
Use this ONLY LOCALLY, for development! This hasn't been tested for
security and is not super efficient.
"""
- def __init__(self, application, media_dir = None):
+ def __init__(self, application, media_dir=None):
from django.conf import settings
self.application = application
if not media_dir:
diff --git a/django/core/validators.py b/django/core/validators.py
index f2f3f44914..4c3f59143e 100644
--- a/django/core/validators.py
+++ b/django/core/validators.py
@@ -249,7 +249,7 @@ def hasNoProfanities(field_data, all_data):
Watch your mouth! The words "f--k" and "s--t" are not allowed here.
"""
field_data = field_data.lower() # normalize
- words_seen = [w for w in settings.PROFANITIES_LIST if field_data.find(w) > -1]
+ words_seen = [w for w in settings.PROFANITIES_LIST if w in field_data]
if words_seen:
from django.utils.text import get_text_list
plural = len(words_seen) > 1
@@ -377,7 +377,7 @@ class IsValidFloat(object):
if len(data) > max_allowed_length:
raise ValidationError, ngettext("Please enter a valid decimal number with at most %s total digit.",
"Please enter a valid decimal number with at most %s total digits.", self.max_digits) % self.max_digits
- if (not '.' in data and len(data) > (max_allowed_length - self.decimal_places)) or ('.' in data and len(data) > (self.max_digits - (self.decimal_places - len(data.split('.')[1])) + 1)):
+ if (not '.' in data and len(data) > (max_allowed_length - self.decimal_places - 1)) or ('.' in data and len(data) > (max_allowed_length - (self.decimal_places - len(data.split('.')[1])))):
raise ValidationError, ngettext( "Please enter a valid decimal number with a whole part of at most %s digit.",
"Please enter a valid decimal number with a whole part of at most %s digits.", str(self.max_digits-self.decimal_places)) % str(self.max_digits-self.decimal_places)
if '.' in data and len(data.split('.')[1]) > self.decimal_places:
diff --git a/django/db/backends/ansi/sql.py b/django/db/backends/ansi/sql.py
index affe77a41f..a6c50298e6 100644
--- a/django/db/backends/ansi/sql.py
+++ b/django/db/backends/ansi/sql.py
@@ -73,7 +73,7 @@ class SchemaBuilder(object):
table_output = []
for f in opts.fields:
- if isinstance(f, models.ForeignKey):
+ if isinstance(f, (models.ForeignKey, models.OneToOneField)):
rel_field = f.rel.get_related_field()
data_type = self.get_rel_data_type(rel_field)
else:
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 1c85b5b68a..7534a634cc 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -367,8 +367,8 @@ class BooleanField(Field):
def to_python(self, value):
if value in (True, False): return value
- if value in ('t', 'True'): return True
- if value in ('f', 'False'): return False
+ if value in ('t', 'True', '1'): return True
+ if value in ('f', 'False', '0'): return False
raise validators.ValidationError, gettext("This value must be either True or False.")
def get_manipulator_field_objs(self):
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index 6276c55f69..dc2ae69fa7 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -618,7 +618,7 @@ class ManyToManyField(RelatedField, Field):
msg = gettext_lazy('Separate multiple IDs with commas.')
else:
msg = gettext_lazy('Hold down "Control", or "Command" on a Mac, to select more than one.')
- self.help_text = string_concat(self.help_text, msg)
+ self.help_text = string_concat(self.help_text, ' ', msg)
def get_manipulator_field_objs(self):
if self.rel.raw_id_admin:
diff --git a/django/db/models/manipulators.py b/django/db/models/manipulators.py
index b0ce48dec5..faf453b86b 100644
--- a/django/db/models/manipulators.py
+++ b/django/db/models/manipulators.py
@@ -215,8 +215,8 @@ class AutomaticManipulator(forms.Manipulator):
# Save many-to-many objects.
for f in related.opts.many_to_many:
if child_follow.get(f.name, None) and not f.rel.edit_inline:
- was_changed = getattr(new_rel_obj, 'set_%s' % f.name)(rel_new_data[f.attname])
- if self.change and was_changed:
+ setattr(new_rel_obj, f.name, f.rel.to.objects.filter(pk__in=rel_new_data[f.attname]))
+ if self.change:
self.fields_changed.append('%s for %s "%s"' % (f.verbose_name, related.opts.verbose_name, new_rel_obj))
# If, in the change stage, all of the core fields were blank and
diff --git a/django/db/models/query.py b/django/db/models/query.py
index 78179244e6..f16e6869e3 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -732,14 +732,10 @@ def parse_lookup(kwarg_items, opts):
# Extract the last elements of the kwarg.
# The very-last is the lookup_type (equals, like, etc).
# The second-last is the table column on which the lookup_type is
- # to be performed.
- # The exceptions to this are:
- # 1) "pk", which is an implicit id__exact;
- # if we find "pk", make the lookup_type "exact', and insert
- # a dummy name of None, which we will replace when
- # we know which table column to grab as the primary key.
- # 2) If there is only one part, or the last part is not a query
- # term, assume that the query is an __exact
+ # to be performed. If this name is 'pk', it will be substituted with
+ # the name of the primary key.
+ # If there is only one part, or the last part is not a query
+ # term, assume that the query is an __exact
lookup_type = path.pop()
if lookup_type == 'pk':
lookup_type = 'exact'
@@ -789,7 +785,7 @@ def lookup_inner(path, lookup_type, value, opts, table, column):
name = path.pop(0)
# Has the primary key been requested? If so, expand it out
# to be the name of the current class' primary key
- if name is None:
+ if name is None or name == 'pk':
name = current_opts.pk.name
# Try to find the name in the fields associated with the current class
diff --git a/django/forms/__init__.py b/django/forms/__init__.py
index 759a32ba81..5f47059f03 100644
--- a/django/forms/__init__.py
+++ b/django/forms/__init__.py
@@ -54,6 +54,7 @@ class Manipulator(object):
def get_validation_errors(self, new_data):
"Returns dictionary mapping field_names to error-message lists"
errors = {}
+ self.prepare(new_data)
for field in self.fields:
errors.update(field.get_validation_errors(new_data))
val_name = 'validate_%s' % field.field_name
@@ -638,7 +639,7 @@ class CheckboxSelectMultipleField(SelectMultipleField):
if str(value) in str_data_list:
checked_html = ' checked="checked"'
field_name = '%s%s' % (self.field_name, value)
- output.append('<li><input type="checkbox" id="%s" class="v%s" name="%s"%s /> <label for="%s">%s</label></li>' % \
+ output.append('<li><input type="checkbox" id="%s" class="v%s" name="%s"%s value="on" /> <label for="%s">%s</label></li>' % \
(self.get_id() + escape(value), self.__class__.__name__, field_name, checked_html,
self.get_id() + escape(value), choice))
output.append('</ul>')
diff --git a/django/middleware/common.py b/django/middleware/common.py
index 4f060b8590..8392fb0e5f 100644
--- a/django/middleware/common.py
+++ b/django/middleware/common.py
@@ -64,9 +64,9 @@ class CommonMiddleware(object):
is_internal = referer and (domain in referer)
path = request.get_full_path()
if referer and not _is_ignorable_404(path) and (is_internal or '?' not in referer):
- ua = request.META.get('HTTP_USER_AGENT','<none>')
+ ua = request.META.get('HTTP_USER_AGENT', '<none>')
mail_managers("Broken %slink on %s" % ((is_internal and 'INTERNAL ' or ''), domain),
- "Referrer: %s\nRequested URL: %s\nUser Agent: %s\n" % (referer, request.get_full_path(), ua))
+ "Referrer: %s\nRequested URL: %s\nUser agent: %s\n" % (referer, request.get_full_path(), ua))
return response
# Use ETags, if requested.
diff --git a/django/views/generic/create_update.py b/django/views/generic/create_update.py
index 034253a549..3a03fa59e4 100644
--- a/django/views/generic/create_update.py
+++ b/django/views/generic/create_update.py
@@ -102,7 +102,7 @@ def update_object(request, model, object_id=None, slug=None,
except ObjectDoesNotExist:
raise Http404, "No %s found for %s" % (model._meta.verbose_name, lookup_kwargs)
- manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.name), follow=follow)
+ manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.attname), follow=follow)
if request.POST:
new_data = request.POST.copy()
@@ -142,7 +142,7 @@ def update_object(request, model, object_id=None, slug=None,
else:
c[key] = value
response = HttpResponse(t.render(c))
- populate_xheaders(request, response, model, getattr(object, object._meta.pk.name))
+ populate_xheaders(request, response, model, getattr(object, object._meta.pk.attname))
return response
def delete_object(request, model, post_delete_redirect,
@@ -196,5 +196,5 @@ def delete_object(request, model, post_delete_redirect,
else:
c[key] = value
response = HttpResponse(t.render(c))
- populate_xheaders(request, response, model, getattr(object, object._meta.pk.name))
+ populate_xheaders(request, response, model, getattr(object, object._meta.pk.attname))
return response