Django
वर्ग आधारित विचार
खोज…
टिप्पणियों
सीबीवी का उपयोग करते समय हमें अक्सर यह जानने की आवश्यकता होती है कि हम प्रत्येक सामान्य वर्ग के लिए कौन सी विधियाँ अधिलेखित कर सकते हैं। Django दस्तावेज़ीकरण का यह पृष्ठ उन सभी सामान्य वर्गों को सूचीबद्ध करता है, जिनकी सभी पद्धतियाँ चपटी हैं और वे वर्ग विशेषताएँ जिनका हम उपयोग कर सकते हैं।
इसके अलावा, क्लासी क्लास बेस्ड व्यू वेबसाइट एक अच्छे इंटरैक्टिव इंटरफ़ेस के साथ एक ही जानकारी प्रदान करती है।
वर्ग आधारित दृश्य
कक्षा आधारित विचार आपको अपने विचारों को विशेष बनाने पर ध्यान केंद्रित करने देते हैं।
पृष्ठ के बारे में स्थैतिक का उपयोग किए गए टेम्पलेट को छोड़कर, कुछ विशेष नहीं हो सकता है। एक टेम्पलेट दृश्य का उपयोग करें! आपको बस एक टेम्पलेट नाम सेट करना है। काम हो गया। आगे।
views.py
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url('^about/', views.AboutView.as_view(), name='about'),
]
ध्यान दें कि हम url में सीधे AboutView
उपयोग कैसे नहीं करते हैं। ऐसा इसलिए है क्योंकि एक as_view()
होने की उम्मीद है और यह ठीक वैसा ही है जैसा कि as_view()
रिटर्न।
संदर्भ डेटा
कभी-कभी, आपके टेम्पलेट को थोड़ी अधिक जानकारी की आवश्यकता होती है। उदाहरण के लिए, हम पेज के हेडर में उपयोगकर्ता को लॉगआउट लिंक के बगल में उनके प्रोफाइल के लिंक के साथ रखना चाहेंगे। इन मामलों में, get_context_data
विधि का उपयोग करें।
views.py
class BookView(DetailView):
template_name = "book.html"
def get_context_data(self, **kwargs)
""" get_context_data let you fill the template context """
context = super(BookView, self).get_context_data(**kwargs)
# Get Related publishers
context['publishers'] = self.object.publishers.filter(is_active=True)
return context
आपको सुपर क्लास पर get_context_data विधि कॉल करने की आवश्यकता है और यह डिफ़ॉल्ट संदर्भ उदाहरण लौटाएगा। कोई भी आइटम जो आप इस डिक्शनरी में जोड़ते हैं, वह टेम्पलेट के लिए उपलब्ध होगा।
book.html
<h3>Active publishers</h3>
<ul>
{% for publisher in publishers %}
<li>{{ publisher.name }}</li>
{% endfor %}
</ul>
सूची और विवरण देखें
टेम्पलेट दृश्य स्थिर पृष्ठ के लिए ठीक हैं और आप उन्हें get_context_data
साथ सब कुछ के लिए उपयोग कर सकते हैं, लेकिन यह फ़ंक्शन के रूप में विचारों का उपयोग करने से बमुश्किल बेहतर होगा।
ListView और DetailView दर्ज करें
एप्लिकेशन / models.py
from django.db import models
class Pokemon(models.Model):
name = models.CharField(max_length=24)
species = models.CharField(max_length=48)
slug = models.CharField(max_length=48)
एप्लिकेशन / views.py
from django.views.generic import ListView, DetailView
from .models import Pokemon
class PokedexView(ListView):
""" Provide a list of Pokemon objects """
model = Pokemon
paginate_by = 25
class PokemonView(DetailView):
model = Pokemon
बस आपको एक मॉडल की अपनी सभी वस्तुओं और विलक्षण वस्तु के विचारों को सूचीबद्ध करने की आवश्यकता है। सूची भी पृष्ठबद्ध है। यदि आप कुछ विशिष्ट चाहते हैं तो आप template_name
प्रदान कर सकते हैं। डिफ़ॉल्ट रूप से, यह मॉडल नाम से उत्पन्न होता है।
एप्लिकेशन / टेम्पलेट्स / अनुप्रयोग / pokemon_list.html
<!DOCTYPE html>
<title>Pokedex</title>
<ul>{% for pokemon in pokemon_list %}
<li><a href="{% url "app:pokemon" pokemon.pk %}">{{ pokemon.name }}</a>
– {{ pokemon.species }}
</ul>
संदर्भ दो नाम, के तहत वस्तु की सूची के साथ से भर जाता है object_list
और मॉडल का नाम, यहाँ से एक दूसरे के निर्माण pokemon_list
। यदि आपने सूची को रोक दिया है, तो आपको अगले और पिछले लिंक का भी ध्यान रखना होगा। पेजिनेटर ऑब्जेक्ट इसकी मदद कर सकता है, यह संदर्भ डेटा में भी उपलब्ध है।
एप्लिकेशन / टेम्पलेट्स / अनुप्रयोग / pokemon_detail.html
<!DOCTYPE html>
<title>Pokemon {{ pokemon.name }}</title>
<h1>{{ pokemon.name }}</h1>
<h2>{{ pokemon.species }} </h2>
जैसा कि पहले, संदर्भ नाम object
और pokemon
तहत आपके मॉडल ऑब्जेक्ट के साथ आबाद है, दूसरा मॉडल नाम से लिया जा रहा है।
एप्लिकेशन / urls.py
from django.conf.urls import url
from . import views
app_name = 'app'
urlpatterns = [
url(r'^pokemon/$', views.PokedexView.as_view(), name='pokedex'),
url(r'^pokemon/(?P<pk>\d+)/$', views.PokemonView.as_view(), name='pokemon'),
]
इस स्निपेट में, प्राइम व्यू के लिए यूआरएल प्राथमिक कुंजी का उपयोग करके बनाया गया है। तर्क के रूप में स्लग का उपयोग करना भी संभव है। यह एक अच्छा दिखने वाला url देता है जिसे याद रखना आसान है। हालाँकि इसके लिए आपके मॉडल में स्लग नामक क्षेत्र की उपस्थिति की आवश्यकता होती है।
url(r'^pokemon/(?P<slug>[A-Za-z0-9_-]+)/$', views.PokemonView.as_view(), name='pokemon'),
अगर एक क्षेत्र कहा जाता slug
मौजूद नहीं है, तो आप उपयोग कर सकते हैं slug_field
में स्थापित करने DetailView
एक अलग क्षेत्र के लिए बात करने के लिए।
पृष्ठांकन के लिए, एक पृष्ठ का उपयोग करें पैरामीटर प्राप्त करें या सीधे url में एक पृष्ठ डालें।
रूप और वस्तु निर्माण
ऑब्जेक्ट बनाने के लिए एक दृश्य लिखना काफी उबाऊ हो सकता है। आपको एक फॉर्म प्रदर्शित करना होगा, आपको इसे सत्यापित करना होगा, आपको आइटम को सहेजना होगा या किसी त्रुटि के साथ फॉर्म को वापस करना होगा। जब तक आप सामान्य संपादन दृश्य में से एक का उपयोग नहीं करते हैं।
एप्लिकेशन / views.py
from django.core.urlresolvers import reverse_lazy
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from .models import Pokemon
class PokemonCreate(CreateView):
model = Pokemon
fields = ['name', 'species']
class PokemonUpdate(UpdateView):
model = Pokemon
fields = ['name', 'species']
class PokemonDelete(DeleteView):
model = Pokemon
success_url = reverse_lazy('pokedex')
CreateView
और UpdateView
में दो आवश्यक विशेषता, model
और fields
। डिफ़ॉल्ट रूप से, दोनों '_form' द्वारा प्रत्ययित मॉडल नाम के आधार पर एक टेम्पलेट नाम का उपयोग करते हैं। आप विशेषता टेम्पलेट_name_suffix के साथ केवल प्रत्यय बदल सकते हैं। ऑब्जेक्ट हटाने से पहले डिलीट व्यू एक पुष्टिकरण संदेश दिखाता है।
UpdateView
और DeleteView
दोनों को ऑब्जेक्ट पर लाने की आवश्यकता है। वे DetailView
के समान विधि का उपयोग करते हैं, यूआरएल से चर निकालते हैं और ऑब्जेक्ट फ़ील्ड से मेल खाते हैं।
ऐप / टेम्प्लेट / ऐप / pokemon_form.html (अर्क)
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save" />
</form>
form
में सभी आवश्यक फ़ील्ड के साथ form
होता है। यहाँ, यह as_p
कारण प्रत्येक फ़ील्ड के लिए पैराग्राफ के साथ प्रदर्शित किया जाएगा।
ऐप / टेम्प्लेट / ऐप / pokemon_confirm_delete.html (निकालें)
<form action="" method="post">
{% csrf_token %}
<p>Are you sure you want to delete "{{ object }}"?</p>
<input type="submit" value="Confirm" />
</form>
अनुरोध जालसाजी के खिलाफ django संरक्षण के कारण csrf_token
टैग की आवश्यकता है। विशेषता कार्रवाई खाली छोड़ दी जाती है क्योंकि फ़ॉर्म प्रदर्शित करने वाला url एक ही है जो डिलीट / सेव को हैंडल करता है।
दो मुद्दे मॉडल के साथ बने रहते हैं, यदि सूची और विवरण के साथ समान का उपयोग करते हैं। सबसे पहले, बनाने और अद्यतन एक लापता पुनर्निर्देशन यूआरएल के बारे में शिकायत करेंगे। get_absolute_url
मॉडल में get_absolute_url
जोड़कर इसे हल किया जा सकता है। दूसरा मुद्दा डिलीट कन्फर्मेशन है जो सार्थक जानकारी प्रदर्शित नहीं करता है। इसे हल करने के लिए, सबसे आसान समाधान एक स्ट्रिंग प्रतिनिधित्व जोड़ना है।
एप्लिकेशन / models.py
from django.db import models
from django.urls import reverse
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible
class Pokemon(models.Model):
name = models.CharField(max_length=24)
species = models.CharField(max_length=48)
def get_absolute_url(self):
return reverse('app:pokemon', kwargs={'pk':self.pk})
def __str__(self):
return self.name
क्लास डेकोरेटर सुनिश्चित करेगा कि अजगर 2 के तहत सब कुछ सुचारू रूप से काम करे।
न्यूनतम उदाहरण
विचार
from django.http import HttpResponse
from django.views.generic import View
class MyView(View):
def get(self, request):
# <view logic>
return HttpResponse('result')
urls.py :
from django.conf.urls import url
from myapp.views import MyView
urlpatterns = [
url(r'^about/$', MyView.as_view()),
]
Django वर्ग आधारित दृश्य: CreateView का उदाहरण
क्लास बेस्ड जेनरिक व्यूज के साथ, हमारे मॉडल्स से CRUD व्यूज बनाना बहुत ही सरल और आसान है। अक्सर, Django व्यवस्थापक में निर्मित पर्याप्त या पसंदीदा नहीं है और हमें अपने स्वयं के CRUD विचारों को रोल करने की आवश्यकता है। सीबीवी ऐसे मामलों में बहुत काम आ सकता है।
CreateView
वर्ग को 3 चीजें चाहिए - एक मॉडल, उपयोग करने के लिए फ़ील्ड और सफलता url।
उदाहरण:
from django.views.generic import CreateView
from .models import Campaign
class CampaignCreateView(CreateView):
model = Campaign
fields = ('title', 'description')
success_url = "/campaigns/list"
निर्माण की सफलता के बाद, उपयोगकर्ता success_url
पुनर्निर्देशित हो success_url
। हम यह भी एक विधि को परिभाषित कर सकते get_success_url
बजाय और प्रयोग reverse
या reverse_lazy
सफलता यूआरएल पाने के लिए।
अब, हमें इस दृश्य के लिए एक टेम्पलेट बनाने की आवश्यकता है। टेम्प्लेट को प्रारूप <app name>/<model name>_form.html
में नामित किया जाना चाहिए। मॉडल का नाम कम कैप में होना चाहिए। उदाहरण के लिए, यदि मेरे ऐप का नाम dashboard
, तो ऊपर दिए गए दृश्य के लिए, मुझे dashboard/campaign_form.html
. dashboard/campaign_form.html
नामक एक टेम्पलेट बनाने की आवश्यकता है।
टेम्प्लेट में, एक form
वेरिएबल में फॉर्म होगा। यहाँ टेम्पलेट के लिए एक नमूना कोड है:
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save" />
</form>
अब हमारे url प्रतिमानों में दृश्य जोड़ने का समय आ गया है।
url('^campaign/new/$', CampaignCreateView.as_view(), name='campaign_new'),
यदि हम URL पर जाते हैं, तो हमें अपने चुने हुए क्षेत्रों के साथ एक फॉर्म देखना चाहिए। जब हम सबमिट करते हैं, तो यह डेटा के साथ मॉडल का एक नया उदाहरण बनाने और इसे सहेजने का प्रयास करेगा। सफलता पर, उपयोगकर्ता को सफलता url पर पुनर्निर्देशित किया जाएगा। त्रुटियों पर, प्रपत्र त्रुटि संदेशों के साथ फिर से प्रदर्शित किया जाएगा।
वन व्यू, मल्टीपल फॉर्म
यहाँ एक Django दृश्य में कई रूपों का उपयोग करने का एक त्वरित उदाहरण है।
from django.contrib import messages
from django.views.generic import TemplateView
from .forms import AddPostForm, AddCommentForm
from .models import Comment
class AddCommentView(TemplateView):
post_form_class = AddPostForm
comment_form_class = AddCommentForm
template_name = 'blog/post.html'
def post(self, request):
post_data = request.POST or None
post_form = self.post_form_class(post_data, prefix='post')
comment_form = self.comment_form_class(post_data, prefix='comment')
context = self.get_context_data(post_form=post_form,
comment_form=comment_form)
if post_form.is_valid():
self.form_save(post_form)
if comment_form.is_valid():
self.form_save(comment_form)
return self.render_to_response(context)
def form_save(self, form):
obj = form.save()
messages.success(self.request, "{} saved successfully".format(obj))
return obj
def get(self, request, *args, **kwargs):
return self.post(request, *args, **kwargs)