Django 2.1 release notes¶
1 augusti 2018
Välkommen till Django 2.1!
Dessa release notes täcker de nya funktionerna, samt några bakåtkompatibla ändringar som du vill vara medveten om när du uppgraderar från Django 2.0 eller tidigare. Vi har ta bort några funktioner som har nått slutet av sin utfasningscykel, och vi har startat utfasningsprocessen för några funktioner.
Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.
Kompatibilitet med Python¶
Django 2.1 stödjer Python 3.5, 3.6 och 3.7. Django 2.0 är den sista versionen som stödjer Python 3.4. Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.
Vad är nytt i Django 2.1¶
Modell ”visa” behörighet¶
En ”view”-behörighet läggs till i modellen Meta.default_permissions
. De nya behörigheterna kommer att skapas automatiskt när du kör migrate
.
Detta gör det möjligt att ge användare skrivskyddad åtkomst till modeller i admin. ModelAdmin.has_view_permission()
är ny. Implementationen är bakåtkompatibel eftersom det inte finns något behov av att tilldela behörigheten ”view” för att tillåta användare som har behörigheten ”change” att redigera objekt.
Det finns ett par backwards incompatible considerations.
Mindre funktioner¶
django.contrib.admin
¶
ModelAdmin.search_fields
accepterar nu alla uppslagsord somfield__exact
.jQuery uppgraderas från version 2.2.3 till 3.3.1.
Den nya metoden
ModelAdmin.delete_queryset()
gör det möjligt att anpassa borttagningsprocessen för åtgärden ”delete selected objects”.Du kan nu åsidosätta standardwebbplatsen för administratörer.
Det nya attributet
ModelAdmin.sortable_by
och metodenModelAdmin.get_sortable_by()
gör det möjligt att begränsa de kolumner som kan sorteras på sidan med ändringslistan.Attributet
admin_order_field
för element iModelAdmin.list_display
kan nu vara ett frågeuttryck.Den nya metoden
ModelAdmin.get_deleted_objects()
gör det möjligt att anpassa borttagningsprocessen för vyn delete och åtgärden ”delete selected”.Mallarna
actions.html
,change_list_results.html
,date_hierarchy.html
,pagination.html
,prepopulated_fields_js.html
,search_form.html
ochsubmit_line.html
kan nu :ref:` åsidosättas per app eller per modell <admin-templates-overridden-per-app-or-model>` (förutom att åsidosättas globalt).Verktygen för administratörens ändringslista och ändringsformulärets objekt kan nu åsidosättas per app, per modell eller globalt <admin-templates-overridden-per-app-or-model> med mallarna change_list_object_tools.html och change_form_object_tools.html.
InlineModelAdmin.has_add_permission()
skickar nu det överordnade objektet som det andra positionella argumentet,obj
.Adminåtgärder kan nu specificera behörigheter för att begränsa deras tillgänglighet för vissa användare.
django.contrib.auth
¶
createsuperuser
ger nu en prompt för att tillåta kringgående avAUTH_PASSWORD_VALIDATORS
-kontrollerna.
django.contrib.gis
¶
Den nya metoden
GEOSGeometry.buffer_with_style()
är en version avbuffer()
som gör det möjligt att anpassa buffertens stil.OpenLayersWidget
är nu baserad på OpenLayers 4.6.5 (tidigare 3.20.1).
django.contrib.sessions
¶
Lagt till inställningen
SESSION_COOKIE_SAMESITE
för att ange cookie-flagganSameSite
för sessionscookies.
Cache¶
I :ref:``local-memory cache backend <local-memory-caching>` används nu en LRU-strategi (least-recently-used) i stället för en pseudoslumpmässig strategi.
Den nya
touch()
-metoden i lågnivå cache API uppdaterar timeouten för cache-nycklar.
CSRF¶
Lagt till inställningen
CSRF_COOKIE_SAMESITE
för att ange cookie-flagganSameSite
för CSRF-cookies.
Formulär¶
Widgeten för
ImageField
återges nu med HTML-attributetaccept="image/*"
.
Internationalisering¶
Lagt till funktionen
get_supported_language_variant()
.Oöversatta strängar för territoriella språkvarianter använder nu översättningarna för det generiska språket. Till exempel använder oöversatta
pt_BR
-strängarpt
-översättningar.
Kommandon för hantering¶
Med det nya alternativet
inspectdb --include-views
kan du skapa modeller för databasvyer.Klassen
BaseCommand
använder nu en anpassad hjälpformatering så att standardalternativ som--verbosity
eller--settings
visas sist i hjälputmatningen, vilket ger en mer framträdande position för underklassade kommandos alternativ.
Migreringar¶
Lagt till stöd för serialisering av
functools.partialmethod
-objekt.För att stödja frysta miljöer kan migreringar laddas från
.pyc
-filer.
Modeller¶
Modeller kan nu använda
__init_subclass__()
från PEP 487.En
BinaryField
kan nu ställas in påeditable=True
om du vill inkludera den i modellformulär.Ett antal nya textdatabasfunktioner har lagts till:
Chr
,Left
,LPad
,LTrim
,Ord
,Repeat
,Replace
,Right
,RPad
,RTrim
, ochTrim
.Den nya funktionen
TruncWeek
trunkerarDateField
ochDateTimeField
till måndagen i en vecka.Frågeuttryck kan nu negeras med hjälp av ett minustecken.
QuerySet.order_by()
ochdistinct(*fields)
stöder nu användning av fälttransformationer.BooleanField
kan nu varanull=True
. Detta uppmuntras istället förNullBooleanField
, som troligen kommer att vara föråldrad i framtiden.Den nya metoden
QuerySet.explain()
visar databasens exekveringsplan för en queryset-fråga.QuerySet.raw()
stöder nuprefetch_related()
.
Förfrågningar och svar¶
Lagt till
HttpRequest.get_full_path_info()
.Lade till argumentet
samesite
tillHttpResponse.set_cookie()
för att tillåta inställning av cookie-flagganSameSite
.Det nya
as_attachment
-argumentet förFileResponse`
ställer inContent-Disposition
-rubriken för att få webbläsaren att fråga om användaren vill ladda ner filen.FileResponse
försöker också ställa in rubrikernaContent-Type
ochContent-Length
där det är lämpligt.
Mallar¶
Det nya filtret
json_script
ger en säker utmatning av ett Python-objekt som JSON, förpackat i en<script>
-tagg, redo att användas med JavaScript.
Tester¶
Lagt till stöd för test
Client
för 307- och 308-omdirigeringar.Test
Client
serialiserar nu en datadictionary för begäran som JSON omcontent_type='application/json'
. Du kan anpassa JSON-kodaren med testklientens parameterjson_encoder
.Den nya metoden
SimpleTestCase.assertWarnsMessage()
är en enklare version avassertWarnsRegex()
.
Bakåtkompatibla ändringar i 2.1¶
Databas backend API¶
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
För att följa PEP 249, undantag där en databas inte stöder en funktion ändras från
NotImplementedError
tilldjango.db.NotSupportedError
.Bytte namn på databasfunktionsflaggan
allow_sliced_subqueries
tillallow_sliced_subqueries_with_in
.DatabaseOperations.distinct_sql()
kräver nu ett ytterligareparams
argument och returnerar en tupel av SQL och parametrar istället för en SQL-sträng.DatabaseFeatures.introspected_boolean_field_type
ändras från en metod till en egenskap.
django.contrib.gis
¶
Stöd för SpatiaLite 4.0 har tagits bort.
Borttaget stöd för MySQL 5.5¶
Slutet på uppströmsstöd för MySQL 5.5 är december 2018. Django 2.1 stöder MySQL 5.6 och högre.
Slopat stöd för PostgreSQL 9.3¶
Slutet på uppströmsstöd för PostgreSQL 9.3 är september 2018. Django 2.1 stöder PostgreSQL 9.4 och högre.
Tog bort BCryptPasswordHasher
från standardinställningen PASSWORD_HASHERS
¶
Om du använde bcrypt med Django 1.4 eller 1.5 (innan BCryptSHA256PasswordHasher
lades till i Django 1.6), kanske du har några lösenord som använder BCryptPasswordHasher
hasher.
Du kan kontrollera om så är fallet på följande sätt:
from django.contrib.auth import get_user_model
User = get_user_model()
User.objects.filter(password__startswith="bcrypt$$")
Om du vill fortsätta att tillåta att dessa lösenord används måste du definiera inställningen PASSWORD_HASHERS
(om du inte redan gör det) och inkludera 'django.contrib.auth.hashers.BCryptPasswordHasher'
.
Flyttad wrap_label
widgetmall kontextvariabel¶
För att åtgärda avsaknaden av <label>
när man använder RadioSelect
och CheckboxSelectMultiple
med MultiWidget
, visas nu kontextvariabeln wrap_label
som ett attribut för varje alternativ. Till exempel, i en anpassad input_option.html
mall, ändra {% if wrap_label %}
till {% if widget.wrap_label %}
.
Överväganden för den nya modellen ”view”-behörighet¶
Anpassade adminformulär måste ta hänsyn till view-only-fallet¶
Med den nya ”view”-behörigheten kan befintliga anpassade adminformulär ge upphov till fel när en användare inte har ändringsbehörighet eftersom formuläret kan komma åt fält som inte finns. Åtgärda detta genom att åsidosätta ModelAdmin.get_form()
och kontrollera om användaren har ”change”-behörighet och returnera standardformuläret om så inte är fallet:
class MyAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if not self.has_change_permission(request, obj):
return super().get_form(request, obj, **kwargs)
return CustomForm
Ny standardvybehörighet kan ge oönskad åtkomst till administratörsvyer¶
Om du har en anpassad behörighet med ett kodnamn av formen view_<modelname>
, kommer den nya hanteringen av visningsbehörighet i admin att tillåta visningsåtkomst till ändringslistan och detaljsidorna för dessa modeller. Om detta inte är önskvärt måste du ändra kodnamnet för din anpassade behörighet.
Diverse¶
Den minsta versionen av
mysqlclient
som stöds har ökats från 1.3.3 till 1.3.7.Stöd för SQLite < 3.7.15 har tagits bort.
Datumformatet i
Set-Cookie
’sExpires
direktiv ändras för att följa RFC 7231 Section 7.1.1.1 istället för Netscapes cookie-standard. Bindestreck i datum somTue, 25-Dec-2018 22:26:13 GMT
tas bort. Denna ändring bör endast vara kosmetisk, utom kanske för föråldrade webbläsare som inte tolkar det nya formatet.allowed_hosts
är nu ett obligatoriskt argument för det privata API:etdjango.utils.http.is_safe_url()
.Attributet
multiple
som återges av widgetenSelectMultiple
använder nu HTML5:s booleska syntax i stället för XHTML:smultiple="multiple"
.HTML som återges av formulärwidgets innehåller inte längre ett avslutande snedstreck på void-element, t.ex.
<br>
. Detta är inkompatibelt med XHTML, även om vissa widgets redan använder aspekter av HTML5, t.ex. booleska attribut.Värdet på
SelectDateWidget
’s empty options ändras från 0 till en tom sträng, vilket huvudsakligen kan kräva vissa justeringar i tester som jämför HTML.User.has_usable_password()
ochis_password_usable()
funktionen returnerar inte längreFalse
om lösenordet ärNone
eller en tom sträng, eller om lösenordet använder en hasher som inte finns iPASSWORD_HASHERS
inställningen. Detta odokumenterade beteende var en regression i Django 1.6 och hindrade användare med sådana lösenord från att begära en återställning av lösenordet. Granska din kod för att bekräfta att din användning av dessa API:er inte förlitar sig på det gamla beteendet.Eftersom migreringar nu laddas från
.pyc
-filer kan du behöva ta bort dem om du arbetar i en blandad Python 2- och Python 3-miljö.Att använda
None
som ettdjango.contrib.postgres.fields.JSONField
-uppslagsvärde matchar nu objekt som har den angivna nyckeln och ett null-värde snarare än objekt som inte har nyckeln.CSS-klassen för admin
field-box
har bytt namn tillfieldBox
för att förhindra konflikter med den klass som ges till modellfält som heter ”box”.Eftersom administratörens mallar
actions.html
,change_list_results.html
,date_hierarchy.html
,pagination.html
,prepopulated_fields_js.html
,search_form.html
ochubmit_line.html
nu kan åsidosättas per app eller per modell, kan du behöva byta namn på befintliga mallar med dessa namn som skrevs för ett annat syfte.QuerySet.raw()
cachelagrar nu sina resultat som vanliga querysets. Använditerator()
om du inte vill ha cachelagring.Databasroutern
allow_relation()
anropas i fler fall. Felaktigt skrivna routrar kan behöva uppdateras i enlighet med detta.Översättningar avaktiveras inte längre innan du kör hanteringskommandon. Om ditt anpassade kommando kräver att översättningar avaktiveras (t.ex. för att infoga oöversatt innehåll i databasen), använd den nya @no_translations decorator.
Hanteringskommandon tillåter inte längre de förkortade formerna av argumenten
--settings
och-pythonpath
.Den privata konstanten
django.db.models.sql.constants.QUERY_TERMS
tas bort. Metodernaget_lookup()
ochget_lookups()
i Lookup Registration API kan vara lämpliga alternativ. Jämfört med konstantenQUERY_TERMS
tillåter de din kod att även ta hänsyn till eventuella anpassade uppslagningar som har registrerats.Kompatibiliteten med
py-bcrypt
är borttagen eftersom den inte underhålls. Använd bcrypt istället.
Funktioner som inte längre är aktuella i 2.1¶
Diverse¶
GIS-funktionen
ForceRHR
är utfasad till förmån för den nyaForcePolygonCW
-funktionen.django.utils.http.cookie_date()
är föråldrad till förmån förhttp_date()
, som följer formatet i den senaste RFC.{% load staticfiles %}
och{% load admin_static %}
är avförda till förmån för{% load static %}
, som fungerar på samma sätt.django.contrib.staticfiles.templatetags.static()
är föråldrad till förmån fördjango.templatetags.static.static()
.Stöd för
InlineModelAdmin.has_add_permission()
-metoder som inte accepterarobj
som det andra positionella argumentet kommer att tas bort i Django 3.0.
Funktioner borttagna i 2.1¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 2.1. Se Funktioner som inte längre är aktuella i 1.11 för detaljer, inklusive hur man tar bort användningen av dessa funktioner.
contrib.auth.views.login()
,logout()
,password_change()
,password_change_done()
,password_reset()
,password_reset_done()
,password_reset_confirm()
ochpassword_reset_complete()
tas bort.Parametern
extra_context
icontrib.auth.views.logout_then_login()
har tagits bort.django.test.runner.setup_databases()
har tagits bort.django.utils.translation.string_concat()
har tagits bort.django.core.cache.backends.memcached.PyLibMCCache
stöder inte längre att skickapylibmc
beteendeinställningar som toppnivåattribut förOPTIONS
.Parametern
host
idjango.utils.http.is_safe_url()
har tagits bort.Avstängning av undantag som uppstår vid rendering av malltaggen
{% include %}
har tagits bort.DatabaseIntrospection.get_indexes()
har tagits bort.Metoden
authenticate()
för autentiseringsbackends kräverrequest
som det första positionella argumentet.Dekoratorn
django.db.models.permalink()
har tagits bort.Inställningen
USE_ETAGS
är borttagen.CommonMiddleware
ochdjango.utils.cache.patch_response_headers()
ställer inte längre in ETags.Attributet
Model._meta.has_auto_field
har tagits bort.url()
:s stöd för inline-flaggor i grupper av reguljära uttryck ((?i)
,(?L)
,(?m)
,(?s)
och(?u)
) har tagits bort.Stöd för
Widget.render()
-metoder utanrenderer
-argumentet har tagits bort.