Django 2.1 versionsinformation¶
1 augusti 2018
Välkommen till Django 2.1!
Dessa versionsinformation 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 supports Python 3.5, 3.6, and 3.7. Django 2.0 is the last version to support Python 3.4. We highly recommend and only officially support the latest release of each series.
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_fieldsaccepterar 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_byoch metodenModelAdmin.get_sortable_by()gör det möjligt att begränsa de kolumner som kan sorteras på sidan med ändringslistan.Attributet
admin_order_fieldför element iModelAdmin.list_displaykan nu vara ett frågeuttryck.The new
ModelAdmin.get_deleted_objects()method allows customizing the deletion process of the delete view and the ”delete selected” action.Mallarna
actions.html,change_list_results.html,date_hierarchy.html,pagination.html,prepopulated_fields_js.html,search_form.htmlochsubmit_line.htmlkan 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¶
createsuperuserger 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_SAMESITEför att ange cookie-flagganSameSiteför sessionscookies.
Cache¶
I local-memory cache backend 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_SAMESITEför att ange cookie-flagganSameSitefö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-viewskan du skapa modeller för databasvyer.Klassen
BaseCommandanvänder nu en anpassad hjälpformatering så att standardalternativ som--verbosityeller--settingsvisas 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
BinaryFieldkan nu ställas in påeditable=Trueom 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
TruncWeektrunkerarDateFieldochDateTimeFieldtill 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.BooleanFieldkan 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
samesitetillHttpResponse.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.FileResponseförsöker också ställa in rubrikernaContent-TypeochContent-Lengthdär det är lämpligt.
Mallar¶
Det nya filtret
json_scriptger 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
Clientför 307- och 308-omdirigeringar.Test
Clientserialiserar 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
NotImplementedErrortilldjango.db.NotSupportedError.Bytte namn på databasfunktionsflaggan
allow_sliced_subqueriestillallow_sliced_subqueries_with_in.DatabaseOperations.distinct_sql()kräver nu ett ytterligareparamsargument 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
mysqlclientsom 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’sExpiresdirektiv ä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 GMTtas 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
multiplesom återges av widgetenSelectMultipleanvä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ängreFalseom lösenordet ärNoneeller en tom sträng, eller om lösenordet använder en hasher som inte finns iPASSWORD_HASHERSinstä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
Nonesom 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-boxhar bytt namn tillfieldBoxfö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.htmlochubmit_line.htmlnu 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
--settingsoch-pythonpath.Den privata konstanten
django.db.models.sql.constants.QUERY_TERMStas bort. Metodernaget_lookup()ochget_lookups()i Lookup Registration API kan vara lämpliga alternativ. Jämfört med konstantenQUERY_TERMStillå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 accepterarobjsom 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_contexticontrib.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.PyLibMCCachestöder inte längre att skickapylibmcbeteendeinställningar som toppnivåattribut förOPTIONS.Parametern
hostidjango.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äverrequestsom det första positionella argumentet.Dekoratorn
django.db.models.permalink()har tagits bort.Inställningen
USE_ETAGSär borttagen.CommonMiddlewareochdjango.utils.cache.patch_response_headers()ställer inte längre in ETags.Attributet
Model._meta.has_auto_fieldhar 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.