---
title: "An creat “láithreáin”"
version: 6.1
locale: ga
source: https://docs.djangoproject.com/ga/6.1/ref/contrib/sites/
canonical: https://djangodocs.dev/ga/6.1/ref/contrib/sites/
---
# An creat “láithreáin”

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.Site`

Múnla chun tréithe fearainn agus ainm a stóráil de láithreán gréasáin.

#### `domain`

An t-ainm fearainn láncháilithe a bhaineann leis an suíomh Gréasáin. Mar shampla, `www.example.com`.

#### `name`

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 samplach

Cén fáth a n-úsáideann tú suíomhanna? Is fearr é a mhíniú trí shamplaí.

### Ábhar a cheangal le suíomhanna iolracha

Bhí na suíomhanna [LJworld.com](https://www2.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áin

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í

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
```

It's fragile to hardcode the site IDs like that, in case they change. The
cleaner way of accomplishing the same thing is to check the current site's
domain:

```
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áint

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ána

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:

```pycon
>>> 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ú

Chun creat na láithreáin a chumasú, lean na céimeanna seo:

1. Cuir `django.contrib.sites'` le do shocrú: INSTALLED\_APPS.
2. Sainmhínigh a: socrú: SITE\_ID socrú:

   ```
   SITE_ID = 1
   ```
3. Rith: DjaDmin: imirce .

`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 chaitheamh

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 `Currentsitemanager`

#### `class managers.CurrentSiteManager`

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.

> **Riachtanas: Socrú: SITE_ID**
>
> Ní féidir an CurrentSiteManager\` inúsáidte ach nuair a shainmhínítear an socrúit:setting: SITE\_ID i do shocruithe.

Ú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()
```

How did [`CurrentSiteManager`](#django.contrib.sites.managers.CurrentSiteManager)
know which field of `Photo` was the
[`Site`](#django.contrib.sites.models.Site)? By default,
[`CurrentSiteManager`](#django.contrib.sites.managers.CurrentSiteManager) looks for
either a [`ForeignKey`](/ga/6.1/ref/models/fields/#django.db.models.ForeignKey) called
`site` or a
[`ManyToManyField`](/ga/6.1/ref/models/fields/#django.db.models.ManyToManyField) called
`sites` to filter on. If you use a field named something other than
`site` or `sites` to identify which
[`Site`](#django.contrib.sites.models.Site) objects your object is
related to, then you need to explicitly pass the custom field name as
a parameter to
[`CurrentSiteManager`](#django.contrib.sites.managers.CurrentSiteManager) on your
model. The following model, which has a field called `publish_on`,
demonstrates this:

```
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 Middleware

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íomhanna

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 `title` agus `description` ar 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í

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.RequestSite`

Aicme a roinneann an príomh-chomhéadan de:class: ~django.contrib.sites.models.site (ie, tá tréithe `domain` agus ainm aige) ach a fhaigheann a chuid sonraí ó réad django:class: ~django.http.httpRequest seachas ó bhunachar sonraí.

#### `__init__(request)`

Socraíonn na tréithe ``` `ainm ``agus `domain ``` don luach de:meth: ~django.http.httpRequest.get\_host.

A [`RequestSite`](#django.contrib.sites.requests.RequestSite) object has a similar
interface to a normal [`Site`](#django.contrib.sites.models.Site) object,
except its [`__init__()`](#django.contrib.sites.requests.RequestSite.__init__)
method takes an [`HttpRequest`](/ga/6.1/ref/request-response/#django.http.HttpRequest) object. It's able to deduce
the `domain` and `name` by looking at the request's domain. It has
`save()` and `delete()` methods to match the interface of
[`Site`](#django.contrib.sites.models.Site), but the methods raise
[`NotImplementedError`](https://docs.python.org/3/library/exceptions.html#NotImplementedError).

## Aicearra `get_current_site`

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)`

Feidhm a sheiceálann an bhfuil `django.contrib.sites` suiteá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í.
