An creat “láithreáin”Link to this heading
Tagann Django le creat roghnach “suíomhanna”. Is crúca é chun rudaí agus feidhmiúlacht a cheangal le láithreáin ghréasáin áirithe, agus is áit shealbhaithe é d'ainmneacha fearainn agus ainmneacha “fhíorúla” do shuíomhanna faoi thiomáint Django.
Úsáid é má chumhachtaíonn do shuiteáil Django aonair níos mó ná suíomh amháin agus ní mór duit idirdhealú a dhéanamh idir na suíomhanna sin ar bhealach éigin.
Tá creat na suíomhanna bunaithe go príomha ar an tsamhail seo:
- class models.SiteLink to this definition
Múnla chun tréithe ``fearainn ```agus ``ainm ``a stóráil de láithreán gréasáin.
- domainLink to this definition
An t-ainm fearainn láncháilithe a bhaineann leis an suíomh Gréasáin. Mar shampla,
www.example.com.
- nameLink to this definition
Ainm “fhíorúil” inléite don duine don láithreán gréasáin.
Sonraíonn an socrú: Setting: SITE_ID ID bunachar sonraí an réad: ~django.contrib.sites.models.site a bhaineann leis an gcomhad socruithe áirithe sin. <django.http.HttpRequest.get_host>Má fhágtar an socrú, déanfaidh an fheidhm:func: ~django.contrib.sites.shortcuts.get_current_site iarracht an suíomh reatha a fháil trí chomparáid idir an:attr: ~django.contrib.sites.models.site.domain leis an ainm óstach ón modh:meth: `request.get_host () `.
Is fútsa atá an chaoi a n-úsáideann tú é seo, ach úsáideann Django é ar chúpla bealach go huathoibríoch trí chúpla coinbhinsiún.
Úsáid samplachLink to this heading
Cén fáth a n-úsáideann tú suíomhanna? Is fearr é a mhíniú trí shamplaí.
Ábhar a cheangal le suíomhanna iolrachaLink to this heading
Bhí na suíomhanna LJworld.com agus Lawrence.com á oibriú ag an eagraíocht nuachta céanna - nuachtán Lawrence Journal-World i Lawrence, Kansas. Dhírigh LJworld.com ar nuacht, agus dhírigh Lawrence.com ar siamsaíocht áitiúil. Ach uaireanta bhí eagarthóirí ag iarraidh alt a fhoilsiú ar* an bheirt suíomhanna.
Ba é an bealach naif chun an fhadhb a réiteach ná a cheangal ar tháirgeoirí láithreáin an scéal céanna a fhoilsiú faoi dhó: uair amháin le haghaidh LJworld.com agus arís do Lawrence.com. Ach tá sé sin neamhéifeachtach do tháirgeoirí láithreáin, agus tá sé iomarcach cóipeanna iolracha den scéal céanna a stóráil sa bhunachar sonraí.
Cuireann réiteach níos fearr deireadh leis an dúbailt ábhair: Úsáideann an dá shuíomh an bunachar sonraí alt céanna, agus tá baint ag alt le suíomh amháin nó níos mó. I dtéarmaíocht samhail Django, léirítear é sin ag a: class: ~Django.db.Models.ManyTomanyField sa tsamhail Article:
from django.contrib.sites.models import Site
from django.db import models
class Article(models.Model):
headline = models.CharField(max_length=200)
# ...
sites = models.ManyToManyField(Site)
Cuireann sé seo roinnt rudaí i gcrích go deas:
Ligeann sé do tháirgeoirí an láithreáin gach ábhar a chur in eagar - ar an dá shuíomh - i gcomhéadan amháin (riarachán Django).
Ciallaíonn sé nach gá an scéal céanna a fhoilsiú faoi dhó sa bhunachar sonraí; níl ach taifead amháin aige sa bhunachar sonraí.
Ligeann sé d'fhorbróirí láithreáin an cód amharc Django céanna a úsáid don dá shuíomh. Seiceálann an cód amharc a thaispeánann scéal ar leith chun a chinntiú go bhfuil an scéal iarrtha ar an suíomh reatha. Breathnaíonn sé rud éigin mar seo:
from django.contrib.sites.shortcuts import get_current_site def article_detail(request, article_id): try: a = Article.objects.get(id=article_id, sites__id=get_current_site(request).id) except Article.DoesNotExist: raise Http404("Article does not exist on this site") # ...
Ábhar a cheangal le suíomh amháinLink to this heading
Ar an gcaoi chéanna, is féidir leat samhail a cheangal leis an tsamhail:class: ~django.contrib.sites.models.site i gcaidreamh go leor le duine, ag baint úsáid:class: ~django.db.models.foreignKey.
Mar shampla, mura gceadaítear alt ach ar shuíomh amháin, úsáideann tú samhail mar seo:
from django.contrib.sites.models import Site
from django.db import models
class Article(models.Model):
headline = models.CharField(max_length=200)
# ...
site = models.ForeignKey(Site, on_delete=models.CASCADE)
Tá na buntáistí céanna aige seo mar a thuairiscítear sa chuid deireanach.
Ag dul isteach sa suíomh reatha ó thuairimíLink to this heading
Is féidir leat creat na suíomhanna i do thuairimí Django a úsáid chun rudaí áirithe a dhéanamh bunaithe ar an suíomh ina bhfuil an radharc á ghlaoch. Mar shampla:
from django.conf import settings
def my_view(request):
if settings.SITE_ID == 3:
# Do something.
pass
else:
# Do something else.
pass
Tá sé leochaileach IDanna an láithreáin mar sin a chódú crua, i gcás go n-athraíonn siad. Is é an bealach níos glaine chun an rud céanna a chur i gcrích ná fearann an láithreáin reatha a sheiceáil:
from django.contrib.sites.shortcuts import get_current_site
def my_view(request):
current_site = get_current_site(request)
if current_site.domain == "foo.com":
# Do something
pass
else:
# Do something else.
pass
Tá an buntáiste aige seo freisin a sheiceáil an bhfuil creat na suíomhanna suiteáilte, agus a: class: ~django.contrib.sites.requests.requestsite sampla a thabhairt ar ais mura bhfuil sé.
Mura bhfuil rochtain agat ar an réad iarratais, is féidir leat an modh ``get_current () ``de bhainisteoir an tsamhail:class: ~django.contrib.sites.models.site a úsáid. Ba cheart duit a chinntiú ansin go bhfuil an socrú: setting: SITE_ID i do chomhad socruithe. Tá an sampla seo coibhéiseach leis an gceann roimhe seo:
from django.contrib.sites.models import Site
def my_function_without_request():
current_site = Site.objects.get_current()
if current_site.domain == "foo.com":
# Do something
pass
else:
# Do something else.
pass
An fearainn reatha a fháil le taispeáintLink to this heading
Tá feidhmiúlacht foláirimh ríomhphoist ag LJworld.com agus Lawrence.com araon, a ligeann do léitheoirí clárú chun fógraí a fháil nuair a tharlaíonn nuacht. Tá sé bunúsach go leor: Síníonn léitheoir suas ar fhoirm gréasáin agus faigheann sé ríomhphost láithreach ag rá, “Go raibh maith agat as do shíntiús.”
Bheadh sé neamhéifeachtach agus iomarcach an cód próiseála sínithe seo a chur i bhfeidhm faoi dhó, mar sin úsáideann na suíomhanna an cód céanna taobh thiar de na radhairc. Ach caithfidh an fógra “go raibh maith agat as síniú” a bheith difriúil do gach suíomh. Trí rudaí:class: ~django.contrib.sites.models.site a úsáid, is féidir linn an fógra “go raibh maith agat” a thiomsú chun luachanna an láithreáin reatha a úsáid: attr: ~django.contrib.sites.models.site.name agus:attr: ~django.contrib.sites.models.site.domain.
Seo sampla den chuma atá ar an radharc láimhseála foirme:
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import send_mail
def register_for_newsletter(request):
# Check form values, etc., and subscribe the user.
# ...
current_site = get_current_site(request)
send_mail(
"Thanks for subscribing to %s alerts" % current_site.name,
"Thanks for your subscription. We appreciate it.\n\n-The %s team."
% (current_site.name,),
"editor@%s" % current_site.domain,
[user.email],
)
# ...
Ar Lawrence.com, tá an líne ábhair ag an ríomhphost seo “Go raibh maith agat as liostáil le foláirimh lawrence.com.” Ar LJworld.com, tá an t-ábhar ag an ríomhphost “Go raibh maith agat as liostáil le foláirimh LJworld.com.” Téann an rud céanna le comhlacht teachtaireachta an ríomhphoist.
Tabhair faoi deara gur bealach níos solúbtha fós (ach níos troma) chun é seo a dhéanamh ná córas teimpléad Django a úsáid. Ag glacadh leis go bhfuil eolairí teimpléad éagsúla ag Lawrence.com agus LJworld.com (:setting: DIRS <TEMPLATES-DIRS>), d'fhéadfá feirm a dhéanamh amach chuig an gcóras teimpléid mar sin:
from django.core.mail import send_mail
from django.template import loader
def register_for_newsletter(request):
# Check form values, etc., and subscribe the user.
# ...
subject = loader.get_template("alerts/subject.txt").render({})
message = loader.get_template("alerts/message.txt").render({})
send_mail(subject, message, "editor@ljworld.com", [user.email])
# ...
Sa chás seo, bheadh ort comhaid teimpléad:file: subject.txt agus:file: message.txt a chruthú d'eolairí teimpléad LJworld.com agus Lawrence.com araon. Tugann sé sin níos mó solúbthachta duit, ach tá sé níos casta freisin.
Is smaoineamh maith é leas a bhaint as na rudaí:class: ~django.contrib.sites.models.site a oiread agus is féidir, chun castacht agus iomarcaíocht neamhriachtanach a bhaint.
An fearainn reatha a fháil le haghaidh URLanna iomlánaLink to this heading
Tá coinbhinsiún get_absolute_url () ``Django go deas chun URL d'earraí a fháil gan an t-ainm fearainn, ach i gcásanna áirithe b'fhéidir gur mhaith leat an URL iomlán a thaispeáint - le ``https: // agus an fearainn agus gach rud - do réad. Chun seo a dhéanamh, is féidir leat creat na láithreáin a úsáid. Sampla:
>>> from django.contrib.sites.models import Site
>>> obj = MyModel.objects.get(id=3)
>>> obj.get_absolute_url()
'/mymodel/objects/3/'
>>> Site.objects.get_current().domain
'example.com'
>>> "https://%s%s" % (Site.objects.get_current().domain, obj.get_absolute_url())
'https://example.com/mymodel/objects/3/'
Creat na láithreáin a chumasúLink to this heading
Chun creat na láithreáin a chumasú, lean na céimeanna seo:
Cuir
django.contrib.sites'le do shocrú: INSTALLED_APPS.Sainmhínigh a: socrú: SITE_ID socrú:
SITE_ID = 1
django.contrib.sites cláraíonn a:data: ~django.db.models.signals.post_migrate láimhseálaí comhartha a chruthaíonn suíomh réamhshocraithe darb ainm example.com leis an bhfearann example.com. Cruthófar an suíomh seo freisin tar éis Django an bunachar sonraí tástála a chruthú. <data-migrations>Chun an t-ainm agus an fearainn ceart a shocrú do do thionscadal, is féidir leat a:ref: `imirce sonraí `a úsáid.
D'fhonn freastal ar shuíomhanna éagsúla i dtáirgeadh, chruthófá comhad socruithe ar leithligh le gach ``SITE_ID` (b'fhéidir allmhairiú ó chomhad socruithe coiteann chun socruithe roinnte a dhúbailt) agus ansin sonraigh an oiriúna:envvar: DJANGO_SETTINGS_MODULE do gach suíomh.
An réad reatha `Láithreach a chaitheamh a chaitheamhLink to this heading
De réir mar a stóráiltear an suíomh reatha sa bhunachar sonraí, d'fhéadfadh ceist bunachar sonraí a bheith mar thoradh ar gach glao chuig `site.objects.get_current () `. Ach tá Django beagán níos cliste ná sin: ar an gcéad iarratas, cuirtear an suíomh reatha a chosc, agus filleann aon ghlao ina dhiaidh sin na sonraí taiscéadaithe in ionad an bunachar sonraí a bhualadh.
Más mian leat ceist bunachar sonraí a chur i bhfeidhm ar chúis ar bith, is féidir leat a rá le Django an taisce a ghlanadh ag baint úsáide as Site.Objects.clear_cache () `:
# First call; current site fetched from database.
current_site = Site.objects.get_current()
# ...
# Second call; current site fetched from cache.
current_site = Site.objects.get_current()
# ...
# Force a database query for the third call.
Site.objects.clear_cache()
current_site = Site.objects.get_current()
An CurrentsitemanagerLink to this heading
- class managers.CurrentSiteManagerLink to this definition
Má tá ról lárnach ag: Class: ~django.contrib.sites.models.site i d'iarratas, smaoinigh ar an gcabhrach: class: ~django.contrib.sites.managers.currentsiteManager a úsáid i do mhúnla (í). Is samhail é: doc: bainisteor a scagann a cheisteanna go huathoibríoch chun </topics/db/managers> rudaí a bhaineann leis an reatha: class: ~django.contrib.sites.models.site a áireamh.
Úsáid:Class: ~django.contrib.sites.managers.currentSiteManager tríd é a chur le do mhúnla go sainráite. Mar shampla:
from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager
from django.db import models
class Photo(models.Model):
photo = models.FileField(upload_to="photos")
photographer_name = models.CharField(max_length=100)
pub_date = models.DateField()
site = models.ForeignKey(Site, on_delete=models.CASCADE)
objects = models.Manager()
on_site = CurrentSiteManager()
Leis an tsamhail seo, cuirfidh Photo.Objects.all () ``gach rud ``Photo` ar ais sa bhunachar sonraí, ach ní thabharfaidh Photo.on_site.all () ``ach na rudaí ``Photo a bhaineann leis an suíomh reatha ar ais, de réir an socruithe: SITE_ID.
Cuir bealach eile, tá an dá ráiteas seo coibhéiseach:
Photo.objects.filter(site=settings.SITE_ID)
Photo.on_site.all()
Cén chaoi a raibh a fhios ag :class: ~django.contrib.sites.managers.currentsiteManager cén réimse de Photo ``a bhí an:class: `~django.contrib.sites.models.site`? De réir réamhshocraithe, féachann :class: `~django.contrib.sites.managers.currentSiteManager` ceachtar a:class: `~django.db.models.foreignKey` ar a dtugtar ``site nó a:class: ~django.db.models.manyToManyField ar a dtugtar sites le scagadh air. Má úsáideann tú réimse darb ainm rud éigin seachas site nó sites chun a aithint cé na ruda:class: ~django.contrib.sites.models.site a bhfuil baint ag do réad leis, ansin ní mór duit ainm an réimse saincheaptha a rith mar pharaiméadar chuig:class: ~django.contrib.sites.managers.currentsiteManager ar do mhúnla. Léiríonn an tsamhail seo a leanas, a bhfuil réimse aige ar a dtugtar publish_on, seo:
from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager
from django.db import models
class Photo(models.Model):
photo = models.FileField(upload_to="photos")
photographer_name = models.CharField(max_length=100)
pub_date = models.DateField()
publish_on = models.ForeignKey(Site, on_delete=models.CASCADE)
objects = models.Manager()
on_site = CurrentSiteManager("publish_on")
Má dhéanann tú iarracht a úsáid:class: ~django.contrib.sites.managers.currentSiteManager agus ainm réimse nach bhfuil ann a chur ar aghaidh, ardóidh Django ValueError.
Mar fhocal scoir, tabhair faoi deara gur dócha go mbeidh tú ag iarraidh “Bainisteoir” gnáth (neamh-shonrach don láithreán) a choinneáil ar do mhúnla, fiú má úsáideann tú: class: ~django.contrib.sites.Managers.CurrentSiteManager. Mar a mhínítear in:doc: doiciméadú bainisteora”, má shain</topics/db/managers> mhíníonn tú bainisteoir de láimh, ansin ní chruthóidh Django an bainisteoir uathoibríoch ``objects = Models.manager () duit. Tabhair faoi deara freisin go n-úsáideann codanna áirithe de Django - eadhon, suíomh riaracháin Django agus tuairimí cineálacha - cibé bainisteoir a shainmhínítear chéad sa tsamhail, mar sin más mian leat go mbeadh rochtain ag do shuíomh riaracháin ar gach rud (ní amháin cinn suíomh-shonrach), cuir ``objects = Models.manager () i do mhúnla, sula sainmhíníonn tú: `~django.contrib.current.sites.managers.tSiteManager.
Láithreán MiddlewareLink to this heading
Má úsáideann tú an patrún seo go minic:
from django.contrib.sites.models import Site
def my_view(request):
site = Site.objects.get_current()
...
Chun athrá a sheachaint, cuir: class: django.contrib.sites.middleware.currentsiteMiddleware chuig:setting: MIDDLEWARE. Socraíonn an middleware an tréith suite ar gach réad iarratais, ionas gur féidir leat request.site a úsáid chun an suíomh reatha a fháil.
Conas a úsáideann Django creat na suíomhannaLink to this heading
Cé nach bhfuil sé ag teastáil go n-úsáideann tú creat na suíomhanna, spreagtar go láidir é, toisc go mbaineann Django leas as i gcúpla áit. Fiú mura bhfuil do shuiteáil Django ag cumhachtú ach suíomh amháin, ba cheart duit an dá soicind a thógáil chun réad an láithreáin a chruthú le do fearainn agus ainm `, agus díriú ar a ID i do shuíomh: SITE_ID.
Seo mar a úsáideann Django creat na suíomhanna:
Sa chreat: mod: atreoruithe <django.contrib.redirects>, tá baint ag gach réad atreoraithe le suíomh áirithe. Nuair a chuardaíonn Django atreorú, cuireann sé an suíomh reatha san áireamh.
Sa chreat: mod: flatpages <django.contrib.flatpages>, tá baint ag gach leathanach cothrom le suíomh áirithe. Nuair a chruthaítear leathanach cothrom, sonraíonn tú ai:class: ~django.contrib.sites.models.site, agus seiceálann seiceál:class: ~django.contrib.flatpages.middleware.flatpageFallBackmiddleware an suíomh reatha chun leathanaigh réidh a aisghabháil le taispeáint.
Sa chreat sindiciúcháin: mod:<django.contrib.syndication>, tá rochtain go huathoibríoch ag na teimpléid le haghaidh
titleagusdescriptionar athróg{{site}}, arb é an:class: ~django.contrib.sites.models.site réad a léiríonn an láithreán reatha. Chomh maith leis sin, úsáidfidh an crúca chun URLanna míreanna a sholáthar an réad ``fearainn ``ón réad reatha:class: ~django.contrib.sites.models.site mura sonraíonn tú fearann láncháilithe.Sa chreat:mod: fíordheimhniúcháin <django.contrib.auth>, :class: django.contrib.auth.views.loginView téann an t-ainm reatha:class: ~django.contrib.sites.models.site chuig an teimpléad mar
{{site_name}}.Úsáideann an dearcadh aicearra (
django.contrib.contenttypes.views.shortcut) réad reatha: class: ~django.contrib.sites.models.site agus URL réada á ríomh.Sa chreat riaracháin, úsáideann an nasc “amharc ar an láithreán” an reatha:class: ~django.contrib.sites.models.site chun an fearainn don láithreán a atreoróidh sé chuig a oibriú amach.
Iarrata rudaíLink to this heading
Baineann roinnt: doc: feidhmchláir django.contrib </ref/contrib/index> leas as creat na láithreáin ach déantar iad a ailtiriú ar bhealach nach gá uir* creat na suíomhanna atá le suiteáil i do bhunachar sonraí. (Níl daoine áirithe ag iarraidh, nó níl* in* an tábla bunachar sonraí breise a éilíonn creat na láithreáin a shuiteáil.) Maidir leis na cásanna sin, soláthraíonn an creat aicme a:class: django.contrib.sites.requests.requestsite, ar féidir é a úsáid mar fhilleadh nuair nach bhfuil creat na suíomhanna tacaíochta le bunachar sonraí ar fáil.
- class requests.RequestSiteLink to this definition
Aicme a roinneann an príomh-chomhéadan de:class: ~django.contrib.sites.models.site (ie, tá tréithe
domainagus ``ainm ``aige) ach a fhaigheann a chuid sonraí ó réad django:class: ~django.http.httpRequest seachas ó bhunachar sonraí.- __init__(request)Link to this definition
Socraíonn na tréithe
`ainm ``agus `domaindon luach de:meth: ~django.http.httpRequest.get_host.
A: Class: ~django.contrib.sites.requests.requestSite tá comhéadan cosúil le réad gnáth:class: ~django.contrib.sites.models.site, seachas a: meth: ~django.contrib.sites.requests.requestSite. Tógann an modh __init__ () `réad: aicme: `~django.http.httpRequest. Tá sé in ann an fearainn agus ainm ``a bhaint amach trí fhéachaint ar fhearann an iarratais. Tá modhanna ``save () ``agus ``delete () aige chun comhéadan de:class: ~django.contrib.sites.models.site a mheaitseáil, ach ardaíonn na modhanna: exc: NotImplementeDerror.
Aicearra get_current_siteLink to this heading
Faoi dheireadh, chun cód titim athchleachtach a sheachaint, soláthraíonn an creat feidhm a:func: django.contrib.sites.shortcuts.get_current_site.
- shortcuts.get_current_site(request)Link to this definition
Feidhm a sheiceálann an bhfuil
django.contrib.sitessuiteáilte agus a thugann an rud reatha: class: ~django.contrib.sites.models.site nó a:class: ~django.contrib.sites.requestsite réad reatha bunaithe ar an iarratas. Breathnaíonn sé suas ar an suíomh reatha bunaithe ar:meth: request.get_host () <django.http.HttpRequest.get_host>`mura sainmhínítear an socrú:setting: `SITE_ID.Féadfaidh fearann agus calafort araon a chur ar ais ag: meth: request.get_host () <django.http.HttpRequest.get_host>`nuair a bhíonn calafort sonraithe go sainráite ag an gceannteideal Óstach, m.sh. ``example.com:80`. I gcásanna den sórt sin, má theipeann ar an cuardach toisc nach n-oireann an t-óstach taifead sa bhunachar sonraí, déantar an calafort a dhíriú agus déantar an cuardach a athbhreithniú leis an gcuid fearainn amháin. Ní bhaineann sé seo le:class: ~django.contrib.sites.requests.requestsite a úsáidfidh an t-óstach neamh-mhodhnaithe i gcónaí.