1
0
mirror of https://github.com/django/django.git synced 2025-07-04 17:59:13 +00:00

Merge trunk to [3216]

git-svn-id: http://code.djangoproject.com/svn/django/branches/multiple-db-support@3227 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jason Pellerin 2006-06-28 17:00:52 +00:00
parent 1184850665
commit 54b6e96957
20 changed files with 654 additions and 299 deletions

View File

@ -8,10 +8,10 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-05-16 09:26-0300\n"
"POT-Creation-Date: 2006-06-19 11:19-0300\n"
"PO-Revision-Date: 2006-05-16 10:05-0300\n"
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
"Language-Team: Spanish <en@li.org>\n"
"Language-Team: Spanish <es@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
@ -29,6 +29,10 @@ msgstr "tipo de contenido"
msgid "content types"
msgstr "tipos de contenido"
#: contrib/auth/views.py:39
msgid "Logged out"
msgstr "Sesión cerrada"
#: contrib/auth/models.py:13 contrib/auth/models.py:26
msgid "name"
msgstr "nombre"
@ -63,7 +67,7 @@ msgstr "nombre"
#: contrib/auth/models.py:57
msgid "last name"
msgstr "apellido(s)"
msgstr "apellido"
#: contrib/auth/models.py:58
msgid "e-mail address"
@ -83,7 +87,7 @@ msgstr "es staff"
#: contrib/auth/models.py:60
msgid "Designates whether the user can log into this admin site."
msgstr "Indica si el usuario puede entrar en este sitio de administración."
msgstr "Indica si el usuario puede ingresar a este sitio de administración."
#: contrib/auth/models.py:61
msgid "active"
@ -149,7 +153,7 @@ msgstr ""
"Su navegador Web aparenta no tener cookies activas. Las cookies son un "
"requerimiento para poder ingresar."
#: contrib/auth/forms.py:36 contrib/auth/forms.py:41
#: contrib/auth/forms.py:36 contrib/auth/forms.py:43
#: contrib/admin/views/decorators.py:9
msgid ""
"Please enter a correct username and password. Note that both fields are case-"
@ -158,6 +162,10 @@ msgstr ""
"Por favor ingrese un nombre de usuario y una contraseña correctos. Note que "
"ambos campos son sensibles a mayúsculas/minúsculas."
#: contrib/auth/forms.py:45
msgid "This account is inactive."
msgstr "Esta cuenta está inactiva"
#: contrib/redirects/models.py:7
msgid "redirect from"
msgstr "redirigir desde"
@ -182,11 +190,11 @@ msgstr ""
"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
"empiece con 'http://'."
#: contrib/redirects/models.py:12
#: contrib/redirects/models.py:13
msgid "redirect"
msgstr "redirección"
#: contrib/redirects/models.py:13
#: contrib/redirects/models.py:14
msgid "redirects"
msgstr "redirecciones"
@ -247,7 +255,7 @@ msgstr "fecha/hora de env
msgid "is public"
msgstr "es público"
#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
#: contrib/comments/models.py:85 contrib/admin/views/doc.py:292
msgid "IP address"
msgstr "Dirección IP"
@ -413,17 +421,20 @@ msgstr[1] ""
"%(text)s"
#: contrib/comments/views/comments.py:117
#, python-format
#, fuzzy, python-format
msgid ""
"This comment was posted by a sketchy user:\n"
"\n"
"%(text)s"
msgstr ""
"Este comentario ha sido enviado por un usuario 'sketcky':\n"
"\n"
"%(text)s"
#: contrib/comments/views/comments.py:189
#: contrib/comments/views/comments.py:280
msgid "Only POSTs are allowed"
msgstr "Sólo se admite POST"
msgstr "Sólo se admiten POSTs"
#: contrib/comments/views/comments.py:193
#: contrib/comments/views/comments.py:284
@ -484,7 +495,7 @@ msgstr "Olvid
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/base.html:23
#: contrib/admin/templates/admin/base.html:24
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
@ -499,7 +510,7 @@ msgstr "Olvid
#: contrib/admin/templates/admin_doc/index.html:4
#: contrib/admin/templates/admin_doc/model_index.html:5
msgid "Log out"
msgstr "Terminar sesión"
msgstr "Cerrar sesión"
#: contrib/comments/templates/comments/form.html:12
msgid "Ratings"
@ -519,7 +530,7 @@ msgstr "Opcional"
msgid "Post a photo"
msgstr "Enviar una foto"
#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:300
#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:303
msgid "URL"
msgstr "URL"
@ -596,7 +607,7 @@ msgstr "nombre de dominio"
#: contrib/sites/models.py:11
msgid "display name"
msgstr "nombre para mostrar"
msgstr "nombre para visualizar"
#: contrib/sites/models.py:15
msgid "site"
@ -616,9 +627,9 @@ msgstr ""
"<ul>\n"
#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
#: contrib/admin/filterspecs.py:143
#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
msgid "All"
msgstr "Todo"
msgstr "Todos/as"
#: contrib/admin/filterspecs.py:109
msgid "Any date"
@ -680,7 +691,7 @@ msgstr "entrada de registro"
msgid "log entries"
msgstr "entradas de registro"
#: contrib/admin/templatetags/admin_list.py:228
#: contrib/admin/templatetags/admin_list.py:230
msgid "All dates"
msgstr "Todas las fechas"
@ -752,12 +763,12 @@ msgstr "y"
#: contrib/admin/views/main.py:338
#, python-format
msgid "Changed %s."
msgstr "Modificado %s."
msgstr "Modifica %s."
#: contrib/admin/views/main.py:340
#, python-format
msgid "Deleted %s."
msgstr "Eliminado %s."
msgstr "Elimina %s."
#: contrib/admin/views/main.py:343
msgid "No fields changed."
@ -802,82 +813,87 @@ msgstr "
#: contrib/admin/views/main.py:533
#, python-format
msgid "Change history: %s"
msgstr "Modificar histórico: %s"
msgstr "Historia de modificaciones: %s"
#: contrib/admin/views/main.py:565
#: contrib/admin/views/main.py:567
#, python-format
msgid "Select %s"
msgstr "Seleccione %s"
#: contrib/admin/views/main.py:565
#: contrib/admin/views/main.py:567
#, python-format
msgid "Select %s to change"
msgstr "Seleccione %s para modificar"
msgstr "Seleccione %s a modificar"
#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
#: contrib/admin/views/main.py:743
msgid "Database error"
msgstr "Error de base de datos"
#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:289
#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:297
#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:300
msgid "Integer"
msgstr "Entero"
#: contrib/admin/views/doc.py:278
#: contrib/admin/views/doc.py:280
msgid "Boolean (Either True or False)"
msgstr "Booleano (Verdadero o Falso)"
#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
#: contrib/admin/views/doc.py:281 contrib/admin/views/doc.py:299
#, python-format
msgid "String (up to %(maxlength)s)"
msgstr "Cadena (máximo %(maxlength)s)"
#: contrib/admin/views/doc.py:280
#: contrib/admin/views/doc.py:282
msgid "Comma-separated integers"
msgstr "Enteros separados por comas"
#: contrib/admin/views/doc.py:281
#: contrib/admin/views/doc.py:283
msgid "Date (without time)"
msgstr "Fecha (sin hora)"
#: contrib/admin/views/doc.py:282
#: contrib/admin/views/doc.py:284
msgid "Date (with time)"
msgstr "Fecha (con hora)"
#: contrib/admin/views/doc.py:283
#: contrib/admin/views/doc.py:285
msgid "E-mail address"
msgstr "Dirección de correo electrónico"
#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
#: contrib/admin/views/doc.py:286 contrib/admin/views/doc.py:287
#: contrib/admin/views/doc.py:290
msgid "File path"
msgstr "Ruta de archivo"
#: contrib/admin/views/doc.py:285
#: contrib/admin/views/doc.py:288
msgid "Decimal number"
msgstr "Número decimal"
#: contrib/admin/views/doc.py:291
#: contrib/admin/views/doc.py:294
msgid "Boolean (Either True, False or None)"
msgstr "Booleano (Verdadero, Falso o Nulo)"
#: contrib/admin/views/doc.py:292
#: contrib/admin/views/doc.py:295
msgid "Relation to parent model"
msgstr "Relación con el modelo padre"
#: contrib/admin/views/doc.py:293
#: contrib/admin/views/doc.py:296
msgid "Phone number"
msgstr "Número de teléfono"
#: contrib/admin/views/doc.py:298
#: contrib/admin/views/doc.py:301
msgid "Text"
msgstr "Texto"
#: contrib/admin/views/doc.py:299
#: contrib/admin/views/doc.py:302
msgid "Time"
msgstr "Hora"
#: contrib/admin/views/doc.py:301
#: contrib/admin/views/doc.py:304
msgid "U.S. state (two uppercase letters)"
msgstr "Estado de los EEUU (dos letras mayúsculas)"
#: contrib/admin/views/doc.py:302
#: contrib/admin/views/doc.py:305
msgid "XML text"
msgstr "Texto XML"
@ -900,7 +916,7 @@ msgstr "Hora:"
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/base.html:23
#: contrib/admin/templates/admin/base.html:24
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
@ -911,7 +927,7 @@ msgstr "Documentaci
#: contrib/admin/templates/admin/object_history.html:3
#: contrib/admin/templates/admin/change_list.html:5
#: contrib/admin/templates/admin/change_form.html:10
#: contrib/admin/templates/admin/base.html:23
#: contrib/admin/templates/admin/base.html:24
#: contrib/admin/templates/admin/delete_confirmation.html:3
#: contrib/admin/templates/registration/password_change_done.html:3
#: contrib/admin/templates/registration/password_change_form.html:3
@ -932,8 +948,9 @@ msgstr "Cambiar contrase
#: contrib/admin/templates/admin/change_list.html:6
#: contrib/admin/templates/admin/500.html:4
#: contrib/admin/templates/admin/change_form.html:13
#: contrib/admin/templates/admin/base.html:28
#: contrib/admin/templates/admin/base.html:29
#: contrib/admin/templates/admin/delete_confirmation.html:6
#: contrib/admin/templates/admin/invalid_setup.html:4
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_reset_form.html:4
#: contrib/admin/templates/registration/logged_out.html:4
@ -946,7 +963,7 @@ msgstr "Inicio"
#: contrib/admin/templates/admin/object_history.html:5
#: contrib/admin/templates/admin/change_form.html:20
msgid "History"
msgstr "Histórico"
msgstr "Historia"
#: contrib/admin/templates/admin/object_history.html:18
msgid "Date/time"
@ -962,15 +979,15 @@ msgstr "Acci
#: contrib/admin/templates/admin/object_history.html:26
msgid "DATE_WITH_TIME_FULL"
msgstr ""
msgstr "j M Y P"
#: contrib/admin/templates/admin/object_history.html:36
msgid ""
"This object doesn't have a change history. It probably wasn't added via this "
"admin site."
msgstr ""
"Este objeto no tiene histórico de cambios. Probablemente no fue añadido "
"usando este sitio de administración."
"Este objeto no tiene historia de modificaciones. Probablemente no fue "
"añadido usando este sitio de administración."
#: contrib/admin/templates/admin/change_list.html:11
#, python-format
@ -1007,6 +1024,22 @@ msgstr ""
msgid "Go"
msgstr "Buscar"
#: contrib/admin/templates/admin/search_form.html:10
#, python-format
msgid "1 result"
msgid_plural "%(counter)s results"
msgstr[0] "un resultado"
msgstr[1] "%(counter)s resultados"
#: contrib/admin/templates/admin/search_form.html:10
#, python-format
msgid "%(full_result_count)s total"
msgstr "total: %(full_result_count)s"
#: contrib/admin/templates/admin/pagination.html:10
msgid "Show all"
msgstr "Mostrar todos/as"
#: contrib/admin/templates/admin/base_site.html:4
msgid "Django site admin"
msgstr "Sitio de administración de Django"
@ -1018,7 +1051,7 @@ msgstr "Administraci
#: contrib/admin/templates/admin/index.html:17
#, python-format
msgid "Models available in the %(name)s application."
msgstr "Modelos disponibles en la aplciación %(name)s."
msgstr "Modelos disponibles en la aplicación %(name)s."
#: contrib/admin/templates/admin/index.html:28
#: contrib/admin/templates/admin/change_form.html:15
@ -1043,7 +1076,7 @@ msgstr "Mis acciones"
#: contrib/admin/templates/admin/index.html:57
msgid "None available"
msgstr "Ninguno disponible"
msgstr "Ninguna disponible"
#: contrib/admin/templates/admin/404.html:4
#: contrib/admin/templates/admin/404.html:8
@ -1058,6 +1091,10 @@ msgstr "Lo sentimos, pero no se encuentra la p
msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
msgstr "¿Ha <a href=\"/password_reset/\">olvidado su contraseña</a>?"
#: contrib/admin/templates/admin/filters.html:4
msgid "Filter"
msgstr "Filtrar"
#: contrib/admin/templates/admin/change_form.html:21
msgid "View on site"
msgstr "Ver en el sitio"
@ -1076,7 +1113,7 @@ msgstr "Ordenaci
msgid "Order:"
msgstr "Orden:"
#: contrib/admin/templates/admin/base.html:23
#: contrib/admin/templates/admin/base.html:24
msgid "Welcome,"
msgstr "Bienvenido,"
@ -1125,6 +1162,16 @@ msgstr "Grabar y continuar editando"
msgid "Save"
msgstr "Grabar"
#: contrib/admin/templates/admin/invalid_setup.html:8
msgid ""
"Something's wrong with your database installation. Make sure the appropriate "
"database tables have been created, and make sure the database is readable by "
"the appropriate user."
msgstr ""
"hay algún problema con su instalación de base de datos. Asegúrese de que las "
"tablas de la misma hayan sido creadas, y asegúrese de que el usuario "
"apropiado tenga permisos de escritura en la base de datos."
#: contrib/admin/templates/registration/password_change_done.html:4
#: contrib/admin/templates/registration/password_change_form.html:4
#: contrib/admin/templates/registration/password_change_form.html:6
@ -1312,17 +1359,25 @@ msgid "As above, but opens the admin page in a new window."
msgstr ""
"Como antes, pero abre la página de administración en una nueva ventana."
#: utils/translation.py:360
#: utils/translation.py:363
msgid "DATE_FORMAT"
msgstr ""
msgstr "j N Y"
#: utils/translation.py:361
#: utils/translation.py:364
msgid "DATETIME_FORMAT"
msgstr ""
msgstr "j N Y P"
#: utils/translation.py:362
#: utils/translation.py:365
msgid "TIME_FORMAT"
msgstr ""
msgstr "P"
#: utils/translation.py:381
msgid "YEAR_MONTH_FORMAT"
msgstr "F Y"
#: utils/translation.py:382
msgid "MONTH_DAY_FORMAT"
msgstr "j \\de F"
#: utils/dates.py:6
msgid "Monday"
@ -1386,7 +1441,7 @@ msgstr "Agosto"
#: utils/dates.py:15
msgid "September"
msgstr "Septiembre"
msgstr "Setiembre"
#: utils/dates.py:15
msgid "October"
@ -1430,11 +1485,11 @@ msgstr ""
#: utils/dates.py:20
msgid "aug"
msgstr ""
msgstr "ago"
#: utils/dates.py:20
msgid "sep"
msgstr ""
msgstr "set"
#: utils/dates.py:20
msgid "oct"
@ -1450,11 +1505,11 @@ msgstr "dic"
#: utils/dates.py:27
msgid "Jan."
msgstr "Ene."
msgstr "Enero"
#: utils/dates.py:27
msgid "Feb."
msgstr "Feb."
msgstr ""
#: utils/dates.py:28
msgid "Aug."
@ -1462,15 +1517,15 @@ msgstr "Ago."
#: utils/dates.py:28
msgid "Sept."
msgstr "Sept."
msgstr "Set."
#: utils/dates.py:28
msgid "Oct."
msgstr "Oct."
msgstr ""
#: utils/dates.py:28
msgid "Nov."
msgstr "Nov."
msgstr ""
#: utils/dates.py:28
msgid "Dec."
@ -1491,7 +1546,7 @@ msgstr[1] "meses"
#: utils/timesince.py:14
msgid "week"
msgid_plural "weeks"
msgstr[0] "semmana"
msgstr[0] "semana"
msgstr[1] "semanas"
#: utils/timesince.py:15
@ -1546,7 +1601,7 @@ msgstr "Espa
#: conf/global_settings.py:45
msgid "Argentinean Spanish"
msgstr ""
msgstr "Español Argentino"
#: conf/global_settings.py:46
msgid "French"
@ -1558,7 +1613,7 @@ msgstr "Gallego"
#: conf/global_settings.py:48
msgid "Hungarian"
msgstr ""
msgstr "Húngaro"
#: conf/global_settings.py:49
msgid "Hebrew"
@ -1636,7 +1691,7 @@ msgid "%(optname)s with this %(fieldname)s already exists."
msgstr "Ya existe %(optname)s con este %(fieldname)s."
#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
#: db/models/fields/__init__.py:545 db/models/fields/__init__.py:556
#: forms/__init__.py:346
msgid "This field is required."
msgstr "Este campo es obligatorio."
@ -1653,11 +1708,11 @@ msgstr "Este valor debe ser True o False."
msgid "This field cannot be null."
msgstr "Este campo no puede ser nulo."
#: db/models/fields/__init__.py:468 core/validators.py:132
#: db/models/fields/__init__.py:471 core/validators.py:135
msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
msgstr "Introduzca una fecha/hora válida en formato YYYY-MM-DD HH:MM."
#: db/models/fields/__init__.py:562
#: db/models/fields/__init__.py:565
msgid "Enter a valid filename."
msgstr "Introduzca un nombre de achivo válido"
@ -1688,43 +1743,48 @@ msgstr[1] ""
"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
"válidos."
#: forms/__init__.py:380
#: forms/__init__.py:381
#, python-format
msgid "Ensure your text is less than %s character."
msgid_plural "Ensure your text is less than %s characters."
msgstr[0] "Asegúrese de que su texto tiene menos de %s carácter."
msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
#: forms/__init__.py:385
#: forms/__init__.py:386
msgid "Line breaks are not allowed here."
msgstr "No se permiten saltos de línea."
#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
#: forms/__init__.py:485 forms/__init__.py:558 forms/__init__.py:597
#, python-format
msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
msgstr "Seleccione una opción válida; '%(data)s' no está en %(choices)s."
#: forms/__init__.py:645
#: forms/__init__.py:659 core/validators.py:151 core/validators.py:379
msgid "No file was submitted. Check the encoding type on the form."
msgstr ""
"No se envió un archivo. Verifique el tipo de codificación en el formulario."
#: forms/__init__.py:661
msgid "The submitted file is empty."
msgstr "El archivo enviado está vacío."
#: forms/__init__.py:699
#: forms/__init__.py:717
msgid "Enter a whole number between -32,768 and 32,767."
msgstr "Introduzca un número entero entre -32,768 y 32,767."
#: forms/__init__.py:708
#: forms/__init__.py:727
msgid "Enter a positive number."
msgstr "Introduzca un número positivo."
#: forms/__init__.py:717
#: forms/__init__.py:737
msgid "Enter a whole number between 0 and 32,767."
msgstr "Introduzca un número entero entre 0 y 32,767."
#: core/validators.py:60
#: core/validators.py:63
msgid "This value must contain only letters, numbers and underscores."
msgstr "Este valor debe contener sólo letras, números y guiones bajos."
#: core/validators.py:64
#: core/validators.py:67
msgid ""
"This value must contain only letters, numbers, underscores, dashes or "
"slashes."
@ -1732,59 +1792,59 @@ msgstr ""
"Este valor debe contener sólo letras, números, guiones bajos, barras (/) o "
"slashes."
#: core/validators.py:72
#: core/validators.py:75
msgid "Uppercase letters are not allowed here."
msgstr "No se admiten letras mayúsculas."
#: core/validators.py:76
#: core/validators.py:79
msgid "Lowercase letters are not allowed here."
msgstr "No se admiten letras minúsculas."
#: core/validators.py:83
#: core/validators.py:86
msgid "Enter only digits separated by commas."
msgstr "Introduzca sólo dígitos separados por comas."
#: core/validators.py:95
#: core/validators.py:98
msgid "Enter valid e-mail addresses separated by commas."
msgstr "Introduzca direcciones de correo válidas separadas por comas."
#: core/validators.py:99
#: core/validators.py:102
msgid "Please enter a valid IP address."
msgstr "Por favor introduzca una dirección IP válida."
#: core/validators.py:103
#: core/validators.py:106
msgid "Empty values are not allowed here."
msgstr "No se admiten valores vacíos."
#: core/validators.py:107
#: core/validators.py:110
msgid "Non-numeric characters aren't allowed here."
msgstr "No se admiten caracteres no numéricos."
#: core/validators.py:111
#: core/validators.py:114
msgid "This value can't be comprised solely of digits."
msgstr "Este valor no puede estar formado sólo por dígitos."
#: core/validators.py:116
#: core/validators.py:119
msgid "Enter a whole number."
msgstr "Introduzca un número entero."
#: core/validators.py:120
#: core/validators.py:123
msgid "Only alphabetical characters are allowed here."
msgstr "Sólo se admiten caracteres alfabéticos."
#: core/validators.py:124
#: core/validators.py:127
msgid "Enter a valid date in YYYY-MM-DD format."
msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
#: core/validators.py:128
#: core/validators.py:131
msgid "Enter a valid time in HH:MM format."
msgstr "Introduzca una hora válida en formato HH:MM."
#: core/validators.py:136
#: core/validators.py:139
msgid "Enter a valid e-mail address."
msgstr "Introduzca una dirección de correo electrónico válida"
#: core/validators.py:148
#: core/validators.py:155
msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
@ -1792,28 +1852,28 @@ msgstr ""
"Envíe una imagen válida. El archivo que ha enviado no era una imagen o se "
"trataba de una imagen corrupta."
#: core/validators.py:155
#: core/validators.py:162
#, python-format
msgid "The URL %s does not point to a valid image."
msgstr "La URL %s no apunta a una imagen válida."
#: core/validators.py:159
#: core/validators.py:166
#, python-format
msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
msgstr ""
"Los números de teléfono deben guardar el formato XXX-XXX-XXXX format. \"%s\" "
"no es válido."
#: core/validators.py:167
#: core/validators.py:174
#, python-format
msgid "The URL %s does not point to a valid QuickTime video."
msgstr "La URL %s no apunta a un vídeo QuickTime válido."
#: core/validators.py:171
#: core/validators.py:178
msgid "A valid URL is required."
msgstr "Se precisa una URL válida."
#: core/validators.py:185
#: core/validators.py:192
#, python-format
msgid ""
"Valid HTML is required. Specific errors are:\n"
@ -1822,116 +1882,129 @@ msgstr ""
"Se precisa HTML válido. Los errores específicos son:\n"
"%s"
#: core/validators.py:192
#: core/validators.py:199
#, python-format
msgid "Badly formed XML: %s"
msgstr "XML mal formado: %s"
#: core/validators.py:202
#: core/validators.py:209
#, python-format
msgid "Invalid URL: %s"
msgstr "URL no válida: %s"
#: core/validators.py:206 core/validators.py:208
#: core/validators.py:213 core/validators.py:215
#, python-format
msgid "The URL %s is a broken link."
msgstr "La URL %s es un enlace roto."
#: core/validators.py:214
#: core/validators.py:221
msgid "Enter a valid U.S. state abbreviation."
msgstr "Introduzca una abreviatura válida de estado de los EEUU."
#: core/validators.py:229
#: core/validators.py:236
#, python-format
msgid "Watch your mouth! The word %s is not allowed here."
msgid_plural "Watch your mouth! The words %s are not allowed here."
msgstr[0] "¡Vigila tu boca! Aquí no admitimos la palabra %s."
msgstr[1] "¡Vigila tu boca! Aquí no admitimos las palabras %s."
#: core/validators.py:236
#: core/validators.py:243
#, python-format
msgid "This field must match the '%s' field."
msgstr "Este campo debe concordar con el campo '%s'."
#: core/validators.py:255
#: core/validators.py:262
msgid "Please enter something for at least one field."
msgstr "Por favor, introduzca algo en al menos un campo."
#: core/validators.py:264 core/validators.py:275
#: core/validators.py:271 core/validators.py:282
msgid "Please enter both fields or leave them both empty."
msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
#: core/validators.py:282
#: core/validators.py:289
#, python-format
msgid "This field must be given if %(field)s is %(value)s"
msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
#: core/validators.py:294
#: core/validators.py:301
#, python-format
msgid "This field must be given if %(field)s is not %(value)s"
msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
#: core/validators.py:313
#: core/validators.py:320
msgid "Duplicate values are not allowed."
msgstr "No se admiten valores duplicados."
#: core/validators.py:336
#: core/validators.py:343
#, python-format
msgid "This value must be a power of %s."
msgstr "Este valor debe ser una potencia de %s."
#: core/validators.py:347
#: core/validators.py:354
msgid "Please enter a valid decimal number."
msgstr "Por favor, introduzca un número decimal válido."
#: core/validators.py:349
#: core/validators.py:356
#, python-format
msgid "Please enter a valid decimal number with at most %s total digit."
msgid_plural ""
"Please enter a valid decimal number with at most %s total digits."
msgstr[0] ""
"Por favor, introduzca un número decimal válido con con un máximo de %s "
"Por favor, introduzca un número decimal válido con con un máximo de un "
"dígito en total."
msgstr[1] ""
"Por favor, introduzca un número decimal válido con un maximo de %s dígitos "
"en total."
#: core/validators.py:352
#: core/validators.py:359
#, python-format
msgid ""
"Please enter a valid decimal number with a whole part of at most %s digit."
msgid_plural ""
"Please enter a valid decimal number with a whole part of at most %s digits."
msgstr[0] ""
"Por favor, introduzca un número decimal válido con un dígito entero como "
"máximo."
msgstr[1] ""
"Por favor, introduzca un número decimal válido con un máximo de %s dígitos "
"enteros."
#: core/validators.py:362
#, python-format
msgid "Please enter a valid decimal number with at most %s decimal place."
msgid_plural ""
"Please enter a valid decimal number with at most %s decimal places."
msgstr[0] ""
"Por favor, introduzca un número decimal válido con un máximo de %s "
"posición decimal."
"Por favor, introduzca un número decimal válido con un máximo de una posición "
"decimal."
msgstr[1] ""
"Por favor, introduzca un número decimal válido con un máximo de %s "
"posiciones decimales."
#: core/validators.py:362
#: core/validators.py:372
#, python-format
msgid "Make sure your uploaded file is at least %s bytes big."
msgstr "Asegúrese de que el archivo que envía tiene al menos %s bytes."
#: core/validators.py:363
#: core/validators.py:373
#, python-format
msgid "Make sure your uploaded file is at most %s bytes big."
msgstr "Asegúrese de que el archivo que envía tiene como máximo %s bytes."
#: core/validators.py:376
#: core/validators.py:390
msgid "The format for this field is wrong."
msgstr "El formato de este campo es incorrecto."
#: core/validators.py:391
#: core/validators.py:405
msgid "This field is invalid."
msgstr "Este campo no es válido."
#: core/validators.py:426
#: core/validators.py:441
#, python-format
msgid "Could not retrieve anything from %s."
msgstr "No pude obtener nada de %s."
#: core/validators.py:429
#: core/validators.py:444
#, python-format
msgid ""
"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
@ -1939,7 +2012,7 @@ msgstr ""
"La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no "
"es válida."
#: core/validators.py:462
#: core/validators.py:477
#, python-format
msgid ""
"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
@ -1948,7 +2021,7 @@ msgstr ""
"Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea "
"empieza por \"%(start)s\".)"
#: core/validators.py:466
#: core/validators.py:481
#, python-format
msgid ""
"Some text starting on line %(line)s is not allowed in that context. (Line "
@ -1957,7 +2030,7 @@ msgstr ""
"Parte del texto que comienza en la línea %(line)s no está permitido en ese "
"contexto. (La línea empieza por \"%(start)s\".)"
#: core/validators.py:471
#: core/validators.py:486
#, python-format
msgid ""
"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
@ -1966,7 +2039,7 @@ msgstr ""
"El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea "
"empieza por \"%(start)s\".)"
#: core/validators.py:476
#: core/validators.py:491
#, python-format
msgid ""
"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
@ -1975,7 +2048,7 @@ msgstr ""
"La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea "
"empieza por \"%(start)s\".)"
#: core/validators.py:480
#: core/validators.py:495
#, python-format
msgid ""
"A tag on line %(line)s is missing one or more required attributes. (Line "
@ -1984,7 +2057,7 @@ msgstr ""
"A una etiqueta de la línea %(line)s le faltan uno o más atributos "
"requeridos. (La línea empieza por \"%(start)s\".)"
#: core/validators.py:485
#: core/validators.py:500
#, python-format
msgid ""
"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
@ -1993,10 +2066,23 @@ msgstr ""
"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
"válido. (La línea empieza por \"%(start)s\".)"
#: template/defaultfilters.py:379
#: template/defaultfilters.py:389
msgid "yes,no,maybe"
msgstr "si,no,tal vez"
#, fuzzy
#~ msgid "%(content_type_name)s"
#~ msgstr "tipos de contenido"
#, fuzzy
#~ msgid "%(myname)s"
#~ msgstr "Agregar %(name)s"
#~ msgid "%(result_count)s result"
#~ msgid_plural "%(counter)s results"
#~ msgstr[0] "un resultado"
#~ msgstr[1] "%(counter)s resultados"
#~ msgid "Comment"
#~ msgstr "Comentario"
@ -2014,16 +2100,3 @@ msgstr "si,no,tal vez"
#~ msgid "packages"
#~ msgstr "paquetes"
#, fuzzy
#~ msgid ""
#~ "Please enter a valid decimal number with a whole part of at most %s digit."
#~ msgid_plural ""
#~ "Please enter a valid decimal number with a whole part of at most %s "
#~ "digits."
#~ msgstr[0] ""
#~ "Por favor, introduzca un número decimal válido con a lo más %s dígito en "
#~ "total."
#~ msgstr[1] ""
#~ "Por favor, introduzca un número decimal válido con a lo más %s dígitos en "
#~ "total."

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Django JavaScript 1.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2005-12-09 11:51+0100\n"
"POT-Creation-Date: 2006-06-19 12:15-0300\n"
"PO-Revision-Date: 2006-05-16 10:20-0300\n"
"Last-Translator: Ramiro Morales <rm0@gmx.net>\n"
"MIME-Version: 1.0\n"
@ -22,7 +22,7 @@ msgstr "%s disponibles"
#: contrib/admin/media/js/SelectFilter2.js:41
msgid "Choose all"
msgstr "Selecciona todos"
msgstr "Seleccionar todos"
#: contrib/admin/media/js/SelectFilter2.js:46
msgid "Add"
@ -43,9 +43,9 @@ msgstr "Haga sus elecciones y haga click en "
#: contrib/admin/media/js/SelectFilter2.js:59
msgid "Clear all"
msgstr "Elimina todos"
msgstr "Eliminar todos"
#: contrib/admin/media/js/dateparse.js:26
#: 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 "
@ -54,7 +54,7 @@ msgstr ""
"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre "
"Noviembre Diciembre"
#: contrib/admin/media/js/dateparse.js:27
#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
msgstr "Domingo Lunes Martes Miércoles Jueves Viernes Sábado"
@ -62,8 +62,17 @@ msgstr "Domingo Lunes Martes Mi
msgid "S M T W T F S"
msgstr "D L M M J V S"
#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
msgid "Show"
msgstr "Mostrar"
#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
msgid "Hide"
msgstr "Ocultar"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:89
msgid "Now"
msgstr "Ahora"
@ -71,40 +80,40 @@ msgstr "Ahora"
msgid "Clock"
msgstr "Reloj"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:86
msgid "Choose a time"
msgstr "Elija una hora"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:90
msgid "Midnight"
msgstr "Medianoche"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:91
msgid "6 a.m."
msgstr "6 a.m."
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:92
msgid "Noon"
msgstr "Mediodía"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:96
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:187
msgid "Cancel"
msgstr "Cancelar"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:120
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:181
msgid "Today"
msgstr "Hoy"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:123
msgid "Calendar"
msgstr "Calendario"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
msgid "Yesterday"
msgstr "Ayer"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
msgid "Tomorrow"
msgstr "Mañana"

View File

@ -0,0 +1,107 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# 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"
"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"
"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"
#: contrib/admin/media/js/SelectFilter2.js:41
msgid "Choose all"
msgstr "全选"
#: contrib/admin/media/js/SelectFilter2.js:46
msgid "Add"
msgstr "增加"
#: contrib/admin/media/js/SelectFilter2.js:48
msgid "Remove"
msgstr "移出"
#: contrib/admin/media/js/SelectFilter2.js:53
msgid "Chosen %s"
msgstr "选择 %s"
#: contrib/admin/media/js/SelectFilter2.js:54
msgid "Select your choice(s) and click "
msgstr "挑选你的选择并且点击 "
#: contrib/admin/media/js/SelectFilter2.js:59
msgid "Clear all"
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"
msgstr "一月 二月 三月 四月 五月 六月 六月 七月 八月 九月 十月 十一月 十二月"
#: contrib/admin/media/js/dateparse.js:33
msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
msgstr "星期天 星期一 星期二 星期三 星期四 星期五 星期六"
#: contrib/admin/media/js/calendar.js:25
msgid "S M T W T F S"
msgstr "日 月 火 水 木 金 土"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
msgid "Now"
msgstr "现在"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
msgid "Clock"
msgstr "时钟"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
msgid "Choose a time"
msgstr "选择一个时间"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
msgid "Midnight"
msgstr "午夜"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
msgid "6 a.m."
msgstr "上午6点"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
msgid "Noon"
msgstr "正午"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
msgid "Cancel"
msgstr "取消"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
msgid "Today"
msgstr "今天"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
msgid "Calendar"
msgstr "日历"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
msgid "Yesterday"
msgstr "昨天"
#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
msgid "Tomorrow"
msgstr "明天"

View File

@ -14,6 +14,10 @@ import inspect, os, re
# Exclude methods starting with these strings from documentation
MODEL_METHODS_EXCLUDE = ('_', 'add_', 'delete', 'save', 'set_')
class GenericSite(object):
domain = 'example.com'
name = 'my site'
def doc_index(request):
if not utils.docutils_is_available:
return missing_docutils_page(request)
@ -102,12 +106,16 @@ def view_index(request):
for settings_mod in settings_modules:
urlconf = __import__(settings_mod.ROOT_URLCONF, '', '', [''])
view_functions = extract_views_from_urlpatterns(urlconf.urlpatterns)
if Site._meta.installed:
site_obj = Site.objects.get(pk=settings_mod.SITE_ID)
else:
site_obj = GenericSite()
for (func, regex) in view_functions:
views.append({
'name': func.__name__,
'module': func.__module__,
'site_id': settings_mod.SITE_ID,
'site': Site.objects.get(pk=settings_mod.SITE_ID),
'site': site_obj,
'url': simplify_regex(regex),
})
return render_to_response('admin_doc/view_index.html', {'views': views}, context_instance=RequestContext(request))
@ -228,6 +236,10 @@ def template_detail(request, template):
templates = []
for site_settings_module in settings.ADMIN_FOR:
settings_mod = __import__(site_settings_module, '', '', [''])
if Site._meta.installed:
site_obj = Site.objects.get(pk=settings_mod.SITE_ID)
else:
site_obj = GenericSite()
for dir in settings_mod.TEMPLATE_DIRS:
template_file = os.path.join(dir, "%s.html" % template)
templates.append({
@ -235,7 +247,7 @@ def template_detail(request, template):
'exists': os.path.exists(template_file),
'contents': lambda: os.path.exists(template_file) and open(template_file).read() or '',
'site_id': settings_mod.SITE_ID,
'site': Site.objects.get(pk=settings_mod.SITE_ID),
'site': site_obj,
'order': list(settings_mod.TEMPLATE_DIRS).index(dir),
})
return render_to_response('admin_doc/template_detail.html', {

View File

@ -3,7 +3,7 @@
<form {% if photos_optional or photos_required %}enctype="multipart/form-data" {% endif %}action="/comments/post/" method="post">
{% if user.is_anonymous %}
<p>{% trans "Username:" %} <input type="text" name="username" id="id_username" /><br />{% trans "Password:" %} <input type="password" name="password" id="id_password" /> (<a href="/accounts/password_reset/">{% trans "Forgotten your password?" %}</a>)</p>
<p><label for="id_username">{% trans "Username:" %}</label> <input type="text" name="username" id="id_username" /><br />{% trans "Password:" %} <input type="password" name="password" id="id_password" /> (<a href="/accounts/password_reset/">{% trans "Forgotten your password?" %}</a>)</p>
{% else %}
<p>{% trans "Username:" %} <strong>{{ user.username }}</strong> (<a href="/accounts/logout/">{% trans "Log out" %}</a>)</p>
{% endif %}
@ -20,11 +20,13 @@
{% endif %}
{% if photos_optional or photos_required %}
<p>{% trans "Post a photo" %} ({% if photos_required %}{% trans "Required" %}{% else %}{% trans "Optional" %}{% endif %}): <input type="file" name="photo" /></p>
<p><label for="id_photo">{% trans "Post a photo" %}</label> ({% if photos_required %}{% trans "Required" %}{% else %}{% trans "Optional" %}{% endif %}):
<input type="file" name="photo" id="id_photo" /></p>
<input type="hidden" name="photo_options" value="{{ photo_options }}" />
{% endif %}
<p>{% trans "Comment:" %}<br /><textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
<p><label for="id_comment">{% trans "Comment:" %}</label><br />
<textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
<input type="hidden" name="options" value="{{ options }}" />
<input type="hidden" name="target" value="{{ target }}" />

View File

@ -1,8 +1,8 @@
{% load i18n %}
{% if display_form %}
<form action="/comments/postfree/" method="post">
<p>{% trans "Your name:" %} <input type="text" id="id_person_name" name="person_name" /></p>
<p>{% trans "Comment:" %}<br /><textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
<p><label for="id_person_name">{% trans "Your name:" %}</label> <input type="text" id="id_person_name" name="person_name" /></p>
<p><label for="id_comment">{% trans "Comment:" %}</label><br /><textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
<input type="hidden" name="options" value="{{ options }}" />
<input type="hidden" name="target" value="{{ target }}" />
<input type="hidden" name="gonzo" value="{{ hash }}" />

View File

@ -16,10 +16,14 @@ class Feed(object):
item_pubdate = None
item_enclosure_url = None
feed_type = feedgenerator.DefaultFeed
title_template = None
description_template = None
def __init__(self, slug, feed_url):
self.slug = slug
self.feed_url = feed_url
self.title_template_name = self.title_template or ('feeds/%s_title.html' % slug)
self.description_template_name = self.description_template or ('feeds/%s_description.html' % slug)
def item_link(self, item):
try:
@ -77,13 +81,13 @@ class Feed(object):
)
try:
title_template = loader.get_template('feeds/%s_title.html' % self.slug)
title_tmp = loader.get_template(self.title_template_name)
except TemplateDoesNotExist:
title_template = Template('{{ obj }}')
title_tmp = Template('{{ obj }}')
try:
description_template = loader.get_template('feeds/%s_description.html' % self.slug)
description_tmp = loader.get_template(self.description_template_name)
except TemplateDoesNotExist:
description_template = Template('{{ obj }}')
description_tmp = Template('{{ obj }}')
for item in self.__get_dynamic_attr('items', obj):
link = add_domain(current_site.domain, self.__get_dynamic_attr('item_link', item))
@ -102,9 +106,9 @@ class Feed(object):
else:
author_email = author_link = None
feed.add_item(
title = title_template.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
title = title_tmp.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
link = link,
description = description_template.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
description = description_tmp.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
unique_id = link,
enclosure = enc,
pubdate = self.__get_dynamic_attr('item_pubdate', item),

View File

@ -803,9 +803,9 @@ class ModelErrorCollection:
self.errors = []
self.outfile = outfile
def add(self, opts, error):
self.errors.append((opts, error))
self.outfile.write(style.ERROR("%s.%s: %s\n" % (opts.app_label, opts.module_name, error)))
def add(self, context, error):
self.errors.append((context, error))
self.outfile.write(style.ERROR("%s: %s\n" % (context, error)))
def get_validation_errors(outfile, app=None):
"""
@ -814,9 +814,14 @@ def get_validation_errors(outfile, app=None):
Returns number of errors.
"""
from django.db import models
from django.db.models.loading import get_app_errors
from django.db.models.fields.related import RelatedObject
e = ModelErrorCollection(outfile)
for (app_name, error) in get_app_errors().items():
e.add(app_name, error)
for cls in models.get_models(app):
opts = cls._meta
@ -858,19 +863,30 @@ def get_validation_errors(outfile, app=None):
e.add(opts, "'%s' has relation with model %s, which has not been installed" % (f.name, rel_opts.object_name))
rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name()
rel_query_name = f.related_query_name()
for r in rel_opts.fields:
if r.name == rel_name:
e.add(opts, "'%s' accessor name '%s.%s' clashes with another field. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
e.add(opts, "Accessor for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
if r.name == rel_query_name:
e.add(opts, "Reverse query name for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
for r in rel_opts.many_to_many:
if r.name == rel_name:
e.add(opts, "'%s' accessor name '%s.%s' clashes with a m2m field. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
e.add(opts, "Accessor for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
if r.name == rel_query_name:
e.add(opts, "Reverse query name for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
for r in rel_opts.get_all_related_many_to_many_objects():
if r.get_accessor_name() == rel_name:
e.add(opts, "'%s' accessor name '%s.%s' clashes with a related m2m field. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
e.add(opts, "Accessor for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
if r.get_accessor_name() == rel_query_name:
e.add(opts, "Reverse query name for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
for r in rel_opts.get_all_related_objects():
if r.get_accessor_name() == rel_name and r.field is not f:
e.add(opts, "'%s' accessor name '%s.%s' clashes with another related field. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
if r.field is not f:
if r.get_accessor_name() == rel_name:
e.add(opts, "Accessor for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
if r.get_accessor_name() == rel_query_name:
e.add(opts, "Reverse query name for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
for i, f in enumerate(opts.many_to_many):
# Check to see if the related m2m field will clash with any
# existing fields, m2m fields, m2m related objects or related objects
@ -879,18 +895,28 @@ def get_validation_errors(outfile, app=None):
e.add(opts, "'%s' has m2m relation with model %s, which has not been installed" % (f.name, rel_opts.object_name))
rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name()
rel_query_name = f.related_query_name()
for r in rel_opts.fields:
if r.name == rel_name:
e.add(opts, "'%s' m2m accessor name '%s.%s' clashes with another field. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
e.add(opts, "Accessor for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
if r.name == rel_query_name:
e.add(opts, "Reverse query name for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
for r in rel_opts.many_to_many:
if r.name == rel_name:
e.add(opts, "'%s' m2m accessor name '%s.%s' clashes with a m2m field. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
e.add(opts, "Accessor for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
if r.name == rel_query_name:
e.add(opts, "Reverse query name for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
for r in rel_opts.get_all_related_many_to_many_objects():
if r.get_accessor_name() == rel_name and r.field is not f:
e.add(opts, "'%s' m2m accessor name '%s.%s' clashes with a related m2m field. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
if r.field is not f:
if r.get_accessor_name() == rel_name:
e.add(opts, "Accessor for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
if r.get_accessor_name() == rel_query_name:
e.add(opts, "Reverse query name for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
for r in rel_opts.get_all_related_objects():
if r.get_accessor_name() == rel_name:
e.add(opts, "'%s' m2m accessor name '%s.%s' clashes with another related field. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
e.add(opts, "Accessor for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
if r.get_accessor_name() == rel_query_name:
e.add(opts, "Reverse query name for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
# Check admin attribute.
if opts.admin is not None:

View File

@ -9,7 +9,7 @@ from django.db.models.query import orderlist2sql, delete_objects
from django.db.models.options import Options, AdminOptions
from django.db import connection, backend, transaction
from django.db.models import signals
from django.db.models.loading import register_models
from django.db.models.loading import register_models, get_model
from django.dispatch import dispatcher
from django.utils.datastructures import SortedDict
from django.utils.functional import curry
@ -60,7 +60,11 @@ class ModelBase(type):
new_class._prepare()
register_models(new_class._meta.app_label, new_class)
return new_class
# Because of the way imports happen (recursively), we may or may not be
# the first class for this model to register with the framework. There
# should only be one class for each model, so we must always return the
# registered version.
return get_model(new_class._meta.app_label, name)
class Model(object):
__metaclass__ = ModelBase

View File

@ -2,6 +2,8 @@
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
import sys
import os
__all__ = ('get_apps', 'get_app', 'get_models', 'get_model', 'register_models')
@ -10,6 +12,9 @@ _app_list = [] # Cache of installed apps.
_app_models = {} # Dictionary of models against app label
# Each value is a dictionary of model name: model class
# Applabel and Model entry exists in cache when individual model is loaded.
_app_errors = {} # Dictionary of errors that were experienced when loading the INSTALLED_APPS
# Key is the app_name of the model, value is the exception that was raised
# during model loading.
_loaded = False # Has the contents of settings.INSTALLED_APPS been loaded?
# i.e., has get_apps() been called?
@ -22,11 +27,9 @@ def get_apps():
for app_name in settings.INSTALLED_APPS:
try:
load_app(app_name)
except ImportError:
pass # Assume this app doesn't have a models.py in it.
# GOTCHA: It may have a models.py that raises ImportError.
except AttributeError:
pass # This app doesn't have a models.py in it.
except Exception, e:
# Problem importing the app
_app_errors[app_name] = e
return _app_list
def get_app(app_label):
@ -39,10 +42,17 @@ def get_app(app_label):
def load_app(app_name):
"Loads the app with the provided fully qualified name, and returns the model module."
global _app_list
mod = __import__(app_name, '', '', ['models'])
if mod.models not in _app_list:
_app_list.append(mod.models)
return mod.models
def get_app_errors():
"Returns the map of known problems with the INSTALLED_APPS"
global _app_errors
get_apps() # Run get_apps() to populate the _app_list cache. Slightly hackish.
return _app_errors
def get_models(app_mod=None):
"""
@ -63,7 +73,6 @@ def get_model(app_label, model_name):
Returns the model matching the given app_label and case-insensitive model_name.
Returns None if no model is found.
"""
get_apps() # Run get_apps() to populate the _app_list cache. Slightly hackish.
try:
model_dict = _app_models[app_label]
except KeyError:
@ -83,4 +92,14 @@ def register_models(app_label, *models):
# in the _app_models dictionary
model_name = model._meta.object_name.lower()
model_dict = _app_models.setdefault(app_label, {})
if model_dict.has_key(model_name):
# The same model may be imported via different paths (e.g.
# appname.models and project.appname.models). We use the source
# filename as a means to detect identity.
fname1 = os.path.abspath(sys.modules[model.__module__].__file__)
fname2 = os.path.abspath(sys.modules[model_dict[model_name].__module__].__file__)
# Since the filename extension could be .py the first time and .pyc
# or .pyo the second time, ignore the extension when comparing.
if os.path.splitext(fname1)[0] == os.path.splitext(fname2)[0]:
continue
model_dict[model_name] = model

View File

@ -87,7 +87,10 @@ class Options(object):
def __repr__(self):
return '<Options for %s>' % self.object_name
def __str__(self):
return "%s.%s" % (self.app_label, self.module_name)
def get_field(self, name, many_to_many=True):
"Returns the requested field by name. Raises FieldDoesNotExist on error."
to_search = many_to_many and (self.fields + self.many_to_many) or self.fields

View File

@ -301,16 +301,18 @@ PostgreSQL fans, and MySQL_ and `SQLite 3`_ are also supported.
Do I have to use mod_python?
----------------------------
Not if you just want to play around and develop things on your local computer.
Django comes with its own Web server, and things should Just Work.
Although we recommend mod_python for production use, you don't have to use it,
thanks to the fact that Django uses an arrangement called WSGI_. Django can
talk to any WSGI-enabled server. The most common non-mod_python deployment
setup is FastCGI. See `How to use Django with FastCGI`_ for full information.
For production use, though, we recommend mod_python. The Django developers have
been running it on mod_python for several years, and it's quite stable.
Also, see the `server arrangements wiki page`_ for other deployment strategies.
However, if you don't want to use mod_python, you can use a different server,
as long as that server has WSGI_ hooks. See the `server arrangements wiki page`_.
If you just want to play around and develop things on your local computer, use
the development Web server that comes with Django. Things should Just Work.
.. _WSGI: http://www.python.org/peps/pep-0333.html
.. _How to use Django with FastCGI: http://www.djangoproject.com/documentation/fastcgi/
.. _server arrangements wiki page: http://code.djangoproject.com/wiki/ServerArrangements
How do I install mod_python on Windows?

View File

@ -2,7 +2,7 @@
How to use Django with FastCGI
==============================
Although the current preferred setup for running Django is Apache_ with
Although the `current preferred setup`_ for running Django is Apache_ with
`mod_python`_, many people use shared hosting, on which FastCGI is the only
viable option. In some setups, FastCGI also allows better security -- and,
possibly, better performance -- than mod_python.
@ -17,6 +17,7 @@ served with no startup time. Unlike mod_python (or `mod_perl`_), a FastCGI
process doesn't run inside the Web server process, but in a separate,
persistent process.
.. _current preferred setup: http://www.djangoproject.com/documentation/modpython/
.. _Apache: http://httpd.apache.org/
.. _mod_python: http://www.modpython.org/
.. _mod_perl: http://perl.apache.org/
@ -35,6 +36,16 @@ persistent process.
security benefit on shared systems, because it means you can secure your
code from other users.
Prerequisite: flup
==================
Before you can start using FastCGI with Django, you'll need to install flup_,
which is a Python library for dealing with FastCGI. Make sure to use the latest
Subversion snapshot of flup, as some users have reported stalled pages with
older flup versions.
.. _flup: http://www.saddi.com/software/flup/
Starting your FastCGI server
============================
@ -120,18 +131,53 @@ Apache setup
============
To use Django with Apache and FastCGI, you'll need Apache installed and
configured, with mod_fastcgi installed and enabled. Consult the Apache
configured, with `mod_fastcgi`_ installed and enabled. Consult the Apache
documentation for instructions.
Add the following to your ``httpd.conf``::
Once you've got that set up, point Apache at your Django FastCGI instance by
editing the ``httpd.conf`` (Apache configuration) file. You'll need to do two
things:
# Connect to FastCGI via a socket / named pipe
* Use the ``FastCGIExternalServer`` directive to specify the location of
your FastCGI server.
* Use ``mod_rewrite`` to point URLs at FastCGI as appropriate.
.. _mod_fastcgi: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
Specifying the location of the FastCGI server
---------------------------------------------
The ``FastCGIExternalServer`` directive tells Apache how to find your FastCGI
server. As the `FastCGIExternalServer docs`_ explain, you can specify either a
``socket`` or a ``host``. Here are examples of both::
# Connect to FastCGI via a socket / named pipe.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock
# Connect to FastCGI via a TCP host/port
# FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033
<VirtualHost 64.92.160.91>
ServerName mysite.com
# Connect to FastCGI via a TCP host/port.
FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033
In either case, the file ``/home/user/public_html/mysite.fcgi`` doesn't
actually have to exist. It's just a URL used by the Web server internally -- a
hook for signifying which requests at a URL should be handled by FastCGI. (More
on this in the next section.)
.. _FastCGIExternalServer docs: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalServer
Using mod_rewrite to point URLs at FastCGI
------------------------------------------
The second step is telling Apache to use FastCGI for URLs that match a certain
pattern. To do this, use the `mod_rewrite`_ module and rewrite URLs to
``mysite.fcgi`` (or whatever you specified in the ``FastCGIExternalServer``
directive, as explained in the previous section).
In this example, we tell Apache to use FastCGI to handle any request that
doesn't represent a file on the filesystem and doesn't start with ``/media/``.
This is probably the most common case, if you're using Django's admin site::
<VirtualHost 12.34.56.78>
ServerName example.com
DocumentRoot /home/user/public_html
Alias /media /home/user/python/django/contrib/admin/media
RewriteEngine On
@ -140,22 +186,18 @@ Add the following to your ``httpd.conf``::
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
</VirtualHost>
Note that while you have to specify a mysite.fcgi, that this file doesn't
actually have to exist. It is just an internal URL to the webserver which
signifies that any requests to that URL will go to the external FastCGI
server.
.. _mod_rewrite: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
LigHTTPd Setup
lighttpd setup
==============
LigHTTPd is a light-weight asynchronous web-server, which is commonly used
for serving static files. However, it supports FastCGI natively, and as such
is a very good choice for serving both static and dynamic media, if your site
does not have any apache-specific components.
lighttpd is a lightweight Web server commonly used for serving static files. It
supports FastCGI natively and, thus, is a good choice for serving both static
and dynamic pages, if your site doesn't have any Apache-specific needs.
Make sure ``mod_fastcgi`` is in your modules list, somewhere after
mod_rewrite and mod_access, but not after mod_accesslog. You'll probably
want mod_alias as well, for serving admin media.
``mod_rewrite`` and ``mod_access``, but not after ``mod_accesslog``. You'll
probably want ``mod_alias`` as well, for serving admin media.
Add the following to your lighttpd config file::
@ -165,7 +207,7 @@ Add the following to your lighttpd config file::
"main" => (
# Use host / port instead of socket for TCP fastcgi
# "host" => "127.0.0.1",
# "port" => 3033,
# "port" => 3033,
"socket" => "/home/user/mysite.sock",
"check-local" => "disable",
)
@ -181,14 +223,15 @@ Add the following to your lighttpd config file::
"^(/.*)$" => "/mysite.fcgi$1",
)
Running multiple django sites on one LigHTTPd
Running multiple Django sites on one lighttpd
---------------------------------------------
LigHTTPd allows you to use what is called conditional configuration to allow
configuration to be customized per-host. In order to specify multiple fastcgi
sites, simply add a conditional block around your fastcgi config for each site::
lighttpd lets you use "conditional configuration" to allow configuration to be
customized per host. To specify multiple FastCGI sites, just add a conditional
block around your FastCGI config for each site::
$HTTP["host"] == "www.website1.com" {
# If the hostname is 'www.example1.com'...
$HTTP["host"] == "www.example1.com" {
server.document-root = "/foo/site1"
fastcgi.server = (
...
@ -196,7 +239,8 @@ sites, simply add a conditional block around your fastcgi config for each site::
...
}
$HTTP["host"] == "www.website2.com" {
# If the hostname is 'www.example2.com'...
$HTTP["host"] == "www.example2.com" {
server.document-root = "/foo/site2"
fastcgi.server = (
...
@ -204,44 +248,44 @@ sites, simply add a conditional block around your fastcgi config for each site::
...
}
You can also run multiple django installations on the same site simply by
specifying multiple entries in the ``fastcgi.server`` directive, add one
fastcgi host for each.
You can also run multiple Django installations on the same site simply by
specifying multiple entries in the ``fastcgi.server`` directive. Add one
FastCGI host for each.
Running Django on a shared-hosting provider
===========================================
Running Django on a shared-hosting provider with Apache
=======================================================
For many users on shared-hosting providers, you aren't able to run your own
server daemons nor do they have access to the httpd.conf of their webserver.
However, it is still possible to run Django using webserver-spawned processes.
Many shared-hosting providers don't allow you to run your own server daemons or
edit the ``httpd.conf`` file. In these cases, it's still possible to run Django
using Web server-spawned processes.
.. admonition:: Note
If you are using webserver-managed processes, there's no need for you
to start the FastCGI server on your own. Apache will spawn a number
of processes, scaling as it needs to.
If you're using Web server-spawned processes, as explained in this section,
there's no need for you to start the FastCGI server on your own. Apache
will spawn a number of processes, scaling as it needs to.
In your web root directory, add this to a file named .htaccess ::
In your Web root directory, add this to a file named ``.htaccess`` ::
AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
Now you must add a small shim script in order for apache to properly
spawn your FastCGI program. Create a mysite.fcgi and place it in your
web directory, making it executable ::
Then, create a small script that tells Apache how to spawn your FastCGI
program. Create a file ``mysite.fcgi`` and place it in your Web directory, and
be sure to make it executable ::
#!/usr/bin/python
import sys, os
# add a custom pythonpath
# Add a custom Python path.
sys.path.insert(0, "/home/user/python")
# switch to the directory of your project. (optional)
# Switch to the directory of your project. (Optional.)
# os.chdir("/home/user/myproject")
# change to the name of your app's settings module
# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"
from django.core.servers.fastcgi import runfastcgi
@ -250,13 +294,13 @@ web directory, making it executable ::
Restarting the spawned server
-----------------------------
If you change the code of your site, to make apache re-load your django
application, you do not need to restart the server. Simply re-upload or
edit your ``mysite.fcgi`` in such a way that the timestamp on the file
will change. When apache sees that the file has been updated, it will
restart your django application for you.
If you change any Python code on your site, you'll need to tell FastCGI the
code has changed. But there's no need to restart Apache in this case. Rather,
just reupload ``mysite.fcgi``, or edit the file, so that the timestamp on the
file will change. When Apache sees the file has been updated, it will restart
your Django application for you.
If you have access to a command shell on a unix system, restarting the
server can be done with the ``touch`` command::
If you have access to a command shell on a Unix system, you can accomplish this
easily by using the ``touch`` command::
touch mysite.fcgi

View File

@ -10,15 +10,17 @@ Python code into memory when the server starts. Code stays in memory throughout
the life of an Apache process, which leads to significant performance gains over
other server arrangements.
Django requires Apache 2.x and mod_python 3.x.
Django requires Apache 2.x and mod_python 3.x, and you should use Apache's
`prefork MPM`_, as opposed to the `worker MPM`_.
We recommend you use Apache's `prefork MPM`_, as opposed to the `worker MPM`_.
You may also be interested in `How to use Django with FastCGI`_.
.. _Apache: http://httpd.apache.org/
.. _mod_python: http://www.modpython.org/
.. _mod_perl: http://perl.apache.org/
.. _prefork MPM: http://httpd.apache.org/docs/2.2/mod/prefork.html
.. _worker MPM: http://httpd.apache.org/docs/2.2/mod/worker.html
.. _How to use Django with FastCGI: http://www.djangoproject.com/documentation/fastcgi/
Basic configuration
===================

View File

@ -134,7 +134,9 @@ put into those elements.
If you don't create a template for either the title or description, the
framework will use the template ``"{{ obj }}"`` by default -- that is,
the normal string representation of the object.
the normal string representation of the object. You can also change the
names of these two templates by specifying ``title_template`` and
``description_template`` as attributes of your ``Feed`` class.
* To specify the contents of ``<link>``, you have two options. For each
item in ``items()``, Django first tries executing a
``get_absolute_url()`` method on that object. If that method doesn't
@ -342,6 +344,16 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
feed_type = feedgenerator.Rss201rev2Feed
# TEMPLATE NAMES -- Optional. These should be strings representing
# names of Django templates that the system should use in rendering the
# title and description of your feed items. Both are optional.
# If you don't specify one, or either, Django will use the template
# 'feeds/SLUG_title.html' and 'feeds/SLUG_description.html', where SLUG
# is the slug you specify in the URL.
title_template = None
description_template = None
# TITLE -- One of the following three is required. The framework looks
# for them in this order.

View File

@ -783,7 +783,7 @@ Our earlier ``current_time`` function could thus be written like this::
In Python 2.4, the decorator syntax also works::
@simple_tag
@register.simple_tag
def do_current_time(token):
...
@ -844,7 +844,7 @@ loader, we'd register the tag like this::
As always, Python 2.4 decorator syntax works as well, so we could have
written::
@inclusion_tag('results.html')
@register.inclusion_tag('results.html')
def show_results(poll):
...

View File

@ -17,17 +17,19 @@ class FieldErrors(models.Model):
class Target(models.Model):
tgt_safe = models.CharField(maxlength=10)
clash1 = models.CharField(maxlength=10)
clash2 = models.CharField(maxlength=10)
clash1_set = models.CharField(maxlength=10)
class Clash1(models.Model):
src_safe = models.CharField(maxlength=10)
src_safe = models.CharField(maxlength=10, core=True)
foreign = models.ForeignKey(Target)
m2m = models.ManyToManyField(Target)
class Clash2(models.Model):
src_safe = models.CharField(maxlength=10)
src_safe = models.CharField(maxlength=10, core=True)
foreign_1 = models.ForeignKey(Target, related_name='id')
foreign_2 = models.ForeignKey(Target, related_name='src_safe')
@ -36,6 +38,7 @@ class Clash2(models.Model):
m2m_2 = models.ManyToManyField(Target, related_name='src_safe')
class Target2(models.Model):
clash3 = models.CharField(maxlength=10)
foreign_tgt = models.ForeignKey(Target)
clashforeign_set = models.ForeignKey(Target)
@ -43,6 +46,8 @@ class Target2(models.Model):
clashm2m_set = models.ManyToManyField(Target)
class Clash3(models.Model):
src_safe = models.CharField(maxlength=10, core=True)
foreign_1 = models.ForeignKey(Target2, related_name='foreign_tgt')
foreign_2 = models.ForeignKey(Target2, related_name='m2m_tgt')
@ -56,7 +61,8 @@ class ClashM2M(models.Model):
m2m = models.ManyToManyField(Target2)
class SelfClashForeign(models.Model):
src_safe = models.CharField(maxlength=10)
src_safe = models.CharField(maxlength=10, core=True)
selfclashforeign = models.CharField(maxlength=10)
selfclashforeign_set = models.ForeignKey("SelfClashForeign")
foreign_1 = models.ForeignKey("SelfClashForeign", related_name='id')
@ -64,11 +70,14 @@ class SelfClashForeign(models.Model):
class SelfClashM2M(models.Model):
src_safe = models.CharField(maxlength=10)
selfclashm2m = models.CharField(maxlength=10)
selfclashm2m_set = models.ManyToManyField("SelfClashM2M")
m2m_1 = models.ManyToManyField("SelfClashM2M", related_name='id')
m2m_2 = models.ManyToManyField("SelfClashM2M", related_name='src_safe')
error_log = """invalid_models.fielderrors: "charfield": CharFields require a "maxlength" attribute.
invalid_models.fielderrors: "floatfield": FloatFields require a "decimal_places" attribute.
invalid_models.fielderrors: "floatfield": FloatFields require a "max_digits" attribute.
@ -78,42 +87,69 @@ invalid_models.fielderrors: "choices": "choices" should be iterable (e.g., a tup
invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples.
invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples.
invalid_models.fielderrors: "index": "db_index" should be either None, True or False.
invalid_models.clash1: 'foreign' accessor name 'Target.clash1_set' clashes with another field. Add a related_name argument to the definition for 'foreign'.
invalid_models.clash1: 'foreign' accessor name 'Target.clash1_set' clashes with a related m2m field. Add a related_name argument to the definition for 'foreign'.
invalid_models.clash1: 'm2m' m2m accessor name 'Target.clash1_set' clashes with another field. Add a related_name argument to the definition for 'm2m'.
invalid_models.clash1: 'm2m' m2m accessor name 'Target.clash1_set' clashes with another related field. Add a related_name argument to the definition for 'm2m'.
invalid_models.clash2: 'foreign_1' accessor name 'Target.id' clashes with another field. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash2: 'foreign_1' accessor name 'Target.id' clashes with a related m2m field. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash2: 'foreign_2' accessor name 'Target.src_safe' clashes with a related m2m field. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.clash2: 'm2m_1' m2m accessor name 'Target.id' clashes with another field. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash2: 'm2m_1' m2m accessor name 'Target.id' clashes with another related field. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash2: 'm2m_2' m2m accessor name 'Target.src_safe' clashes with another related field. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clash3: 'foreign_1' accessor name 'Target2.foreign_tgt' clashes with another field. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash3: 'foreign_1' accessor name 'Target2.foreign_tgt' clashes with a related m2m field. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash3: 'foreign_2' accessor name 'Target2.m2m_tgt' clashes with a m2m field. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.clash3: 'foreign_2' accessor name 'Target2.m2m_tgt' clashes with a related m2m field. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.clash3: 'm2m_1' m2m accessor name 'Target2.foreign_tgt' clashes with another field. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash3: 'm2m_1' m2m accessor name 'Target2.foreign_tgt' clashes with another related field. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash3: 'm2m_2' m2m accessor name 'Target2.m2m_tgt' clashes with a m2m field. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clash3: 'm2m_2' m2m accessor name 'Target2.m2m_tgt' clashes with another related field. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clashforeign: 'foreign' accessor name 'Target2.clashforeign_set' clashes with another field. Add a related_name argument to the definition for 'foreign'.
invalid_models.clashm2m: 'm2m' m2m accessor name 'Target2.clashm2m_set' clashes with a m2m field. Add a related_name argument to the definition for 'm2m'.
invalid_models.target2: 'foreign_tgt' accessor name 'Target.target2_set' clashes with a related m2m field. Add a related_name argument to the definition for 'foreign_tgt'.
invalid_models.target2: 'foreign_tgt' accessor name 'Target.target2_set' clashes with a related m2m field. Add a related_name argument to the definition for 'foreign_tgt'.
invalid_models.target2: 'foreign_tgt' accessor name 'Target.target2_set' clashes with another related field. Add a related_name argument to the definition for 'foreign_tgt'.
invalid_models.target2: 'clashforeign_set' accessor name 'Target.target2_set' clashes with a related m2m field. Add a related_name argument to the definition for 'clashforeign_set'.
invalid_models.target2: 'clashforeign_set' accessor name 'Target.target2_set' clashes with a related m2m field. Add a related_name argument to the definition for 'clashforeign_set'.
invalid_models.target2: 'clashforeign_set' accessor name 'Target.target2_set' clashes with another related field. Add a related_name argument to the definition for 'clashforeign_set'.
invalid_models.target2: 'm2m_tgt' m2m accessor name 'Target.target2_set' clashes with a related m2m field. Add a related_name argument to the definition for 'm2m_tgt'.
invalid_models.target2: 'm2m_tgt' m2m accessor name 'Target.target2_set' clashes with another related field. Add a related_name argument to the definition for 'm2m_tgt'.
invalid_models.target2: 'm2m_tgt' m2m accessor name 'Target.target2_set' clashes with another related field. Add a related_name argument to the definition for 'm2m_tgt'.
invalid_models.target2: 'clashm2m_set' m2m accessor name 'Target.target2_set' clashes with a related m2m field. Add a related_name argument to the definition for 'clashm2m_set'.
invalid_models.target2: 'clashm2m_set' m2m accessor name 'Target.target2_set' clashes with another related field. Add a related_name argument to the definition for 'clashm2m_set'.
invalid_models.target2: 'clashm2m_set' m2m accessor name 'Target.target2_set' clashes with another related field. Add a related_name argument to the definition for 'clashm2m_set'.
invalid_models.selfclashforeign: 'selfclashforeign_set' accessor name 'SelfClashForeign.selfclashforeign_set' clashes with another field. Add a related_name argument to the definition for 'selfclashforeign_set'.
invalid_models.selfclashforeign: 'foreign_1' accessor name 'SelfClashForeign.id' clashes with another field. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.selfclashforeign: 'foreign_2' accessor name 'SelfClashForeign.src_safe' clashes with another field. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.selfclashm2m: 'selfclashm2m_set' m2m accessor name 'SelfClashM2M.selfclashm2m_set' clashes with a m2m field. Add a related_name argument to the definition for 'selfclashm2m_set'.
invalid_models.selfclashm2m: 'm2m_1' m2m accessor name 'SelfClashM2M.id' clashes with another field. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.selfclashm2m: 'm2m_2' m2m accessor name 'SelfClashM2M.src_safe' clashes with another field. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clash1: Accessor for field 'foreign' clashes with field 'Target.clash1_set'. Add a related_name argument to the definition for 'foreign'.
invalid_models.clash1: Accessor for field 'foreign' clashes with related m2m field 'Target.clash1_set'. Add a related_name argument to the definition for 'foreign'.
invalid_models.clash1: Reverse query name for field 'foreign' clashes with field 'Target.clash1'. Add a related_name argument to the definition for 'foreign'.
invalid_models.clash1: Accessor for m2m field 'm2m' clashes with field 'Target.clash1_set'. Add a related_name argument to the definition for 'm2m'.
invalid_models.clash1: Accessor for m2m field 'm2m' clashes with related field 'Target.clash1_set'. Add a related_name argument to the definition for 'm2m'.
invalid_models.clash1: Reverse query name for m2m field 'm2m' clashes with field 'Target.clash1'. Add a related_name argument to the definition for 'm2m'.
invalid_models.clash2: Accessor for field 'foreign_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash2: Accessor for field 'foreign_1' clashes with related m2m field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash2: Reverse query name for field 'foreign_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash2: Reverse query name for field 'foreign_1' clashes with related m2m field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash2: Accessor for field 'foreign_2' clashes with related m2m field 'Target.src_safe'. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.clash2: Reverse query name for field 'foreign_2' clashes with related m2m field 'Target.src_safe'. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.clash2: Accessor for m2m field 'm2m_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash2: Accessor for m2m field 'm2m_1' clashes with related field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash2: Reverse query name for m2m field 'm2m_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash2: Reverse query name for m2m field 'm2m_1' clashes with related field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash2: Accessor for m2m field 'm2m_2' clashes with related field 'Target.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clash2: Reverse query name for m2m field 'm2m_2' clashes with related field 'Target.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clash3: Accessor for field 'foreign_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash3: Accessor for field 'foreign_1' clashes with related m2m field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash3: Reverse query name for field 'foreign_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash3: Reverse query name for field 'foreign_1' clashes with related m2m field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.clash3: Accessor for field 'foreign_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.clash3: Accessor for field 'foreign_2' clashes with related m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.clash3: Reverse query name for field 'foreign_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.clash3: Reverse query name for field 'foreign_2' clashes with related m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.clash3: Accessor for m2m field 'm2m_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash3: Accessor for m2m field 'm2m_1' clashes with related field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash3: Reverse query name for m2m field 'm2m_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash3: Reverse query name for m2m field 'm2m_1' clashes with related field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.clash3: Accessor for m2m field 'm2m_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clash3: Accessor for m2m field 'm2m_2' clashes with related field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clash3: Reverse query name for m2m field 'm2m_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clash3: Reverse query name for m2m field 'm2m_2' clashes with related field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.clashforeign: Accessor for field 'foreign' clashes with field 'Target2.clashforeign_set'. Add a related_name argument to the definition for 'foreign'.
invalid_models.clashm2m: Accessor for m2m field 'm2m' clashes with m2m field 'Target2.clashm2m_set'. Add a related_name argument to the definition for 'm2m'.
invalid_models.target2: Accessor for field 'foreign_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'foreign_tgt'.
invalid_models.target2: Accessor for field 'foreign_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'foreign_tgt'.
invalid_models.target2: Accessor for field 'foreign_tgt' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'foreign_tgt'.
invalid_models.target2: Accessor for field 'clashforeign_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashforeign_set'.
invalid_models.target2: Accessor for field 'clashforeign_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashforeign_set'.
invalid_models.target2: Accessor for field 'clashforeign_set' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'clashforeign_set'.
invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
invalid_models.selfclashforeign: Accessor for field 'selfclashforeign_set' clashes with field 'SelfClashForeign.selfclashforeign_set'. Add a related_name argument to the definition for 'selfclashforeign_set'.
invalid_models.selfclashforeign: Reverse query name for field 'selfclashforeign_set' clashes with field 'SelfClashForeign.selfclashforeign'. Add a related_name argument to the definition for 'selfclashforeign_set'.
invalid_models.selfclashforeign: Accessor for field 'foreign_1' clashes with field 'SelfClashForeign.id'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.selfclashforeign: Reverse query name for field 'foreign_1' clashes with field 'SelfClashForeign.id'. Add a related_name argument to the definition for 'foreign_1'.
invalid_models.selfclashforeign: Accessor for field 'foreign_2' clashes with field 'SelfClashForeign.src_safe'. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.selfclashforeign: Reverse query name for field 'foreign_2' clashes with field 'SelfClashForeign.src_safe'. Add a related_name argument to the definition for 'foreign_2'.
invalid_models.selfclashm2m: Accessor for m2m field 'selfclashm2m_set' clashes with m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'selfclashm2m_set'.
invalid_models.selfclashm2m: Reverse query name for m2m field 'selfclashm2m_set' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'selfclashm2m_set'.
invalid_models.selfclashm2m: Accessor for m2m field 'm2m_1' clashes with field 'SelfClashM2M.id'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.selfclashm2m: Accessor for m2m field 'm2m_2' clashes with field 'SelfClashM2M.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_1' clashes with field 'SelfClashM2M.id'. Add a related_name argument to the definition for 'm2m_1'.
invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_2' clashes with field 'SelfClashM2M.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
"""

View File

@ -2,7 +2,7 @@
27. Many-to-many relationships between the same two tables
In this example, A Person can have many friends, who are also people. Friendship is a
symmetrical relationshiup - if I am your friend, you are my friend.
symmetrical relationship - if I am your friend, you are my friend.
A person can also have many idols - but while I may idolize you, you may not think
the same of me. 'Idols' is an example of a non-symmetrical m2m field. Only recursive