Tuairimí cineálacha bunaithe ar rang ionsuiteLink to this heading
Is féidir le feidhmchláir gréasáin a scríobh a bheith aontónach, toisc go ndéanaimid patrúin áirithe a athdhéanamh Déanann Django iarracht cuid den aonfhoirmeacht sin a thógáil ar shiúl ag na sraitheanna samhail agus teimpléad, ach bíonn forbróirí gréasáin ag an leamh seo ag an leibhéal radhairc freisin.
Forbraíodh tuairimí cineálacha Django chun an pian sin a mhaolú. Tógann siad nathanna agus patrúin choitianta áirithe a fhaightear i bhforbairt amharc agus déanann siad teibí orthu ionas gur féidir leat tuairimí coitianta ar shonraí a scríobh go tapa gan an iomarca cód a
Is féidir linn tascanna coitianta áirithe a aithint, cosúil le liosta rudaí a thaispeáint, agus cód a scríobh a thaispeánann liosta de*aon réad*. Ansin is féidir an tsamhail atá i gceist a chur ar aghaidh mar argóint bhreise chuig an URLConf.
Seolann Django le tuairimí cineálacha chun na nithe seo a leanas a dhéanamh:
Taispeáin liosta agus leathanaigh mionsonraithe le haghaidh réad amháin. Dá mbeimid ag cruthú feidhmchlár chun comhdhálacha a bhainistiú ansin bheadh TalkListView agus
RegisteredUserListViewina samplaí de thuairimí liosta. Is sampla é leathanach cainte amháin den rud a thugaimid ar radharc “mionsonraí”.Cuir rudaí dáta-bhunaithe i láthair i leathanaigh cartlainne blian/mí/lá, mionsonraí gaolmhara, agus leathanaigh “is déanaí”.
Lig d'úsáideoirí rudaí a chruthú, a nuashonrú agus a scriosadh - le húdarú nó gan údarú.
Le chéile, soláthraíonn na tuairimí seo comhéadain chun na tascanna is coitianta a thagann forbróirí a dhéanamh
Tuairimí cineálacha a leLink to this heading
Níl aon cheist ann gur féidir le tuairimí cineálacha a úsáid a bhrostú go suntasach. I bhformhór na dtionscadail, áfach, tagann nóiméad nuair nach leor na tuairimí cineálacha a thuilleadh. Go deimhin, is í an cheist is coitianta a chuireann forbróirí nua Django ná conas tuairimí cineálacha a láimhseáil le raon níos leithne cásanna.
Seo ceann de na cúiseanna a athdhearadh tuairimí cineálacha don scaoileadh 1.3 - roimhe seo, bhí feidhmeanna amharc acu le sraith roghanna mealltach; anois, seachas cuid mhór cumraíochta a chur isteach sa URLConf, is é an bealach molta chun tuairimí cineálacha a leathnú ná iad a fho-aicmiú, agus a gcuid tréithe nó modhanna a shárú.
É sin ráite, beidh teorainn ag tuairimí cineálacha. Má aimsíonn tú go bhfuil tú ag streachailt do dhearcadh a chur i bhfeidhm mar fho-aicme de radharc cineálach, ansin b'fhéidir go mbeidh sé níos éifeachtaí duit ach an cód a theastaíonn uait a scríobh, ag baint úsáide as do thuairimí rang-bhunaithe nó feidhmiúla féin.
Tá níos mó samplaí de thuairimí cineálacha ar fáil i roinnt feidhmchlár tríú páirtí, nó d'fhéadfá do chuid féin a scríobh de réir mar is gá.
Tuairimí cineálacha ar rudaíLink to this heading
TemplateView certainly is useful, but
Django's generic views really shine when it comes to presenting views of your
database content. Because it's such a common task, Django comes with a handful
of built-in generic views to help generate list and detail views of objects.
Tosaímid trí fhéachaint ar roinnt samplaí de liosta rudaí nó réad aonair a thaispeáint.
Beidh muid ag baint úsáide as na samhlacha seo:
# models.py
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Meta:
ordering = ["-name"]
def __str__(self):
return self.name
class Author(models.Model):
salutation = models.CharField(max_length=10)
name = models.CharField(max_length=200)
email = models.EmailField()
headshot = models.ImageField(upload_to="author_headshots")
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField("Author")
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
publication_date = models.DateField()
Anois ní mór dúinn dearcadh a shainiú:
# views.py
from django.views.generic import ListView
from books.models import Publisher
class PublisherListView(ListView):
model = Publisher
Ar deireadh, cuir an radharc sin isteach i do urls:
# urls.py
from django.urls import path
from books.views import PublisherListView
urlpatterns = [
path("publishers/", PublisherListView.as_view()),
]
Sin an cód Python go léir a chaithfimid a scríobh. Ní mór dúinn teimpléad a scríobh fós, áfach. D'fhéadfaimis a insint go sainráite don radharc cén teimpléad atá le húsáid trí thréith template_name a chur leis an radharc, ach in éagmais teimpléad follasach tabharfaidh Django amach ceann ó ainm an réada. Sa chás seo, is é ” books/publisher_list.html “ an teimpléad intuartha - tagann an chuid “leabhair” ó ainm an aip a shainmhíníonn an tsamhail, agus is é an giotán “foilsitheora” an leagan íseal d'ainm an tsamhail.
Déanfar an teimpléad seo a léiriú i gcoinne comhthéacs ina bhfuil athróg ar a dtugtar object_list` ina bhfuil na rudaí foilsitheora go léir. D'fhéadfadh cuma seo a bheith ar theimpléad:
{% extends "base.html" %}
{% block content %}
<h2>Publishers</h2>
<ul>
{% for publisher in object_list %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
{% endblock %}
Sin go léir atá ann i ndáiríre. Tagann gnéithe fionnuar uile na tuairimí cineálacha ó na tréithe atá leagtha amach ar an radharc cineálach a athrú. Déan:doc: tagairt tuairimí cineálacha '</ref/class-based-views/index> doiciméadaíonn na tuairimí cineálacha go léir agus a roghanna go mion; breithneoidh an chuid eile den doiciméad seo cuid de na bealaí coitianta a d'fhéadfá tuairimí cineálacha a shaincheapadh agus a leathnú.
Comhthéacsanna teimpléid “cairdiúla”Link to this heading
B'fhéidir gur thug tú faoi deara go stórálann ár dteimpléad liosta foilsitheoirí samplach na foilsitheoirí go léir in athróg darb ainm object_list`. Cé go n-oibríonn sé seo go breá, níl sé chomh “cairdiúil” sin d'údair teimpléid: caithfidh siad “a fhios” a bheith acu go bhfuil siad ag déileáil le foilsitheoirí anseo.
Bhuel, má tá tú ag déileáil le réad samhail, déantar é seo duit cheana féin. Nuair a bhíonn tú ag déileáil le réad nó tacar fiosrúcháin, tá Django in ann an comhthéacs a líonadh ag baint úsáide as an leagan íseal d'ainm an ranga samhail. Cuirtear é seo ar fáil i dteannta leis an iontráil réamhshocraithe object_list, ach tá na sonraí céanna go díreach ann, ie publisher_list.
Mura meaitseáil mhaith é seo fós, is féidir leat ainm an athróg comhthéacs a shocrú de láimh. Sonraíonn an tréith context_object_name ar amharc cineálach an t-athróg comhthéacs atá le húsáid:
# views.py
from django.views.generic import ListView
from books.models import Publisher
class PublisherListView(ListView):
model = Publisher
context_object_name = "my_favorite_publishers"
Is smaoineamh maith i gcónaí é context_object_name úsáideach a sholáthar. Gabhfaidh do chomhoibrithe a dhearann teimpléid buíochas leat.
Comhthéacs breise leisLink to this heading
Go minic ní mór duit roinnt faisnéise breise a chur i láthair seachas an rud a sholáthraíonn an dearcadh cineálach. Mar shampla, smaoinigh ar liosta de na leabhair go léir a thaispeáint ar leathanach mionsonraí gach foilsitheora. Soláthraíonn amharc cineálach: Class: ~django.views.generic.detail.detailView don fhoilsitheoir don chomhthéacs, ach conas a gheobhaidh muid faisnéis bhreise sa teimpléad sin?
Is é an freagra ar subclass:class: ~django.views.generic.detail.detailView agus cuir do chur i bhfeidhm féin ar an modh ``get_context_data ``a sholáthar. Cuireann an cur i bhfeidhm réamhshocraithe an réad atá á thaispeáint leis an teimpléad, ach is féidir leat é a shárú chun níos mó a sheoladh:
from django.views.generic import DetailView
from books.models import Book, Publisher
class PublisherDetailView(DetailView):
model = Publisher
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super().get_context_data(**kwargs)
# Add in a QuerySet of all the books
context["book_list"] = Book.objects.all()
return context
Ag féachaint ar fhothacair rudaíLink to this heading
Anois déanaimis breathnú níos dlúithe ar an argóint samhail ``a bhí á úsáid againn ar fad. Tá an argóint ``samhail ``, a shonraíonn an tsamhail bunachar sonraí ar a oibreoidh an dearcadh air, ar fáil ar na tuairimí cineálacha go léir a oibríonn ar réad amháin nó ar bhailiúchán rudaí. Mar sin féin, ní hé an argóint ``samhail ``an t-aon bhealach chun na rudaí a oibreoidh an dearcadh orthu a shonrú - is féidir leat liosta na rudaí a shonrú ag baint úsáide as an argóint ``Queryset:
from django.views.generic import DetailView
from books.models import Publisher
class PublisherDetailView(DetailView):
context_object_name = "publisher"
queryset = Publisher.objects.all()
Is gearrthéacs é model = Foilsitheoir ``a shonrú chun ``queryset = Publisher.Objects.all () a rá. Mar sin féin, trí úsáid a bhaint as queryset chun liosta scagtha rudaí a shainiú is féidir leat a bheith níos sainiúla faoi na rudaí a bheidh le feiceáil sa radharc (féach: Doc: /topics/db/queries le haghaidh tuilleadh faisnéise fao:class: ~django.db.models.queryset rudaí, agus féach an tagair:doc: rang-bhunaithe tuairim le haghaidh na </ref/class-based-views/index> sonraí iomlána).
Chun sampla a roghnú, b'fhéidir gur mhaith linn liosta leabhair a ordú de réir dáta foilsithe, agus an chéad cheann is déanaí:
from django.views.generic import ListView
from books.models import Book
class BookListView(ListView):
queryset = Book.objects.order_by("-publication_date")
context_object_name = "book_list"
Is sampla beag go leor é sin, ach léiríonn sé an smaoineamh go deas. De ghnáth beidh tú ag iarraidh níos mó a dhéanamh ná rudaí a athordú amháin. Más mian leat liosta leabhair ag foilsitheoir áirithe a chur i láthair, is féidir leat an teicníc chéanna a úsáid:
from django.views.generic import ListView
from books.models import Book
class AcmeBookListView(ListView):
context_object_name = "book_list"
queryset = Book.objects.filter(publisher__name="ACME Publishing")
template_name = "books/acme_list.html"
Tabhair faoi deara go bhfuilimid ag úsáid ainm teimpléad saincheaptha in éineacht le ``queryset ``scagtha. Mura ndéanfaimis, úsáidfeadh an dearcadh cineálach an teimpléad céanna leis an liosta réada “vanilla”, rud b'fhéidir nach é an rud a theastaíonn uainn.
Tabhair faoi deara freisin nach bealach an-galánta é seo chun leabhair a bhaineann go sonrach don fhoilsitheoir a dhéanamh. Más mian linn leathanach foilsitheora eile a chur leis, bheadh dornán línte eile ag teastáil uainn sa URLConf, agus bheadh níos mó ná cúpla foilsitheoir míréasúnach. Déileálfaimid leis an bhfadhb seo sa chéad chuid eile.
Scagadh dinimiciúilLink to this heading
Riachtanas coitianta eile is ea na rudaí a thugtar i leathanach liosta a scagadh de réir eochair éigin sa URL. Níos luaithe rinneamar ainm an fhoilsitheora go crua-chódaithe sa URLConf, ach cad dá mbeadh muid ag iarraidh dearcadh a scríobh a thaispeánann na leabhair go léir ag foilsitheoir treallach éigin?
Go háirithe, tá a: meth: ~django.views.generic.list.multipleObjectMixin.get_querySet modh is féidir linn a shárú. De réir réamhshocraithe, filleann sé luach an tréith ``queryset ``, ach is féidir linn é a úsáid chun níos mó loighic a chur leis.
Is é an phríomhchuid chun an obair seo a dhéanamh ná go stóráiltear rudaí úsáideacha éagsúla ar féin nuair a thugtar tuairimí rang-bhunaithe; chomh maith leis an iarratas (self.request`) san áireamh seo argóintí seasmhacha (self.args`) agus ainmbunaithe (self.kwargs`) a ghabhadh de réir an URLConf.
Anseo, tá URLConf againn le grúpa gabhadh amháin:
# urls.py
from django.urls import path
from books.views import PublisherBookListView
urlpatterns = [
path("books/<publisher>/", PublisherBookListView.as_view()),
]
Ansin, scríobhfaimid an radharc ``PublisherBookListView ``féin:
# views.py
from django.shortcuts import get_object_or_404
from django.views.generic import ListView
from books.models import Book, Publisher
class PublisherBookListView(ListView):
template_name = "books/books_by_publisher.html"
def get_queryset(self):
self.publisher = get_object_or_404(Publisher, name=self.kwargs["publisher"])
return Book.objects.filter(publisher=self.publisher)
Tá úsáid a bhaint as get_queryset chun loighic a chur leis an roghnú cueryset chomh áisiúil agus atá sé cumhachtach. Mar shampla, dá dteastaíonn uainn, d'fhéadfaimis self.request.user a úsáid chun scagadh ag baint úsáide as an úsáideoir reatha, nó loighic níos casta eile.
Is féidir linn an foilsitheoir a chur isteach sa chomhthéacs ag an am céanna, ionas gur féidir linn é a úsáid sa teimpléad:
# ...
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super().get_context_data(**kwargs)
# Add in the publisher
context["publisher"] = self.publisher
return context
Obair bhreise a dhéanamhLink to this heading
Is éard atá i gceist leis an bpatrún coitianta deireanach a bhreathnóimid air roinnt oibre breise a dhéanamh roimh nó tar éis glaoch ar an dear
Samhlaigh go raibh réimse las_accessed againn ar ár samhail ``Author ``a bhí á úsáid againn chun súil a choinneáil ar an uair dheireanach a d'fhéach duine ar bith ar an údar sin:
# models.py
from django.db import models
class Author(models.Model):
salutation = models.CharField(max_length=10)
name = models.CharField(max_length=200)
email = models.EmailField()
headshot = models.ImageField(upload_to="author_headshots")
last_accessed = models.DateTimeField()
Ní bheadh aon rud ar eolas ag an rang cineálach ``DetailView ``faoin réimse seo, ach arís d'fhéadfaimis dearcadh saincheaptha a scríobh chun an réimse sin a choinneáil nuashonraithe.
Ar dtús, bheadh orainn giotán mionsonraithe údair a chur leis sa URLConf chun dearcadh saincheaptha a chur in iúl:
from django.urls import path
from books.views import AuthorDetailView
urlpatterns = [
# ...
path("authors/<int:pk>/", AuthorDetailView.as_view(), name="author-detail"),
]
Ansin scríobhfaimis ár dtuairim nua - is é get_object an modh a aisghabhann an réad - mar sin déanaimid é a shárú agus fillteann muid an glao:
from django.utils import timezone
from django.views.generic import DetailView
from books.models import Author
class AuthorDetailView(DetailView):
queryset = Author.objects.all()
def get_object(self):
obj = super().get_object()
# Record the last accessed date
obj.last_accessed = timezone.now()
obj.save()
return obj