13- ساخت اولین اپلیکیشن در جنگو(4) (صفحه ادمین):
۰۸ تیر ۱۴۰۴
0 دیدگاه
آموزش ساخت اولین اپلیکیشن Django – بخش چهارم: فرمها، پردازش داده و استفاده از Generic Views
در این بخش از آموزش، که ادامهی بخش قبلی (بخش سوم) است، اپلیکیشن وبپول (web-poll) را توسعه میدهیم و به پردازش فرمها و بهینهسازی کد با استفاده از Generic Views میپردازیم.
1. ایجاد یک فرم ساده (Minimal Form)
برای ثبت رأی کاربران، ابتدا باید در قالب (template) مربوط به جزئیات یک پرسش (poll)، یک فرم HTML ایجاد کنیم.
کد نمونه در polls/templates/polls/detail.html:
html
نکات مهم:
هر گزینه (choice) به صورت یک دکمه رادیویی (radio button) نمایش داده میشود.
name="choice"باعث میشود که هنگام ارسال فرم، گزینه انتخاب شده با کلیدchoiceارسال شود.action="{% url 'polls:vote' question.id %}"آدرس ارسال فرم را به view مربوط به ثبت رأی تنظیم میکند.method="post"اهمیت دارد زیرا ارسال دادهها که باعث تغییر اطلاعات سرور میشود، باید با POST انجام شود.استفاده از
{% csrf_token %}برای جلوگیری از حملات CSRF الزامی است.
2. ساخت View برای پردازش فرم و ثبت رأی
در polls/views.py، یک تابع vote ایجاد میکنیم که داده ارسال شده توسط فرم را دریافت و پردازش کند.
from django.db.models import F
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from .models import Choice, Question
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected_choice = question.choice_set.get(pk=request.POST["choice"])
except (KeyError, Choice.DoesNotExist):
# نمایش مجدد فرم با پیام خطا در صورت عدم انتخاب گزینه
return render(request, "polls/detail.html", {
"question": question,
"error_message": "You didn't select a choice.",
})
else:
selected_choice.votes = F("votes") + 1 # افزایش رأی به صورت اتمیک
selected_choice.save()
# پس از موفقیت، به صفحه نتایج هدایت میشویم تا ارسال مجدد اطلاعات جلوگیری شود
return HttpResponseRedirect(reverse("polls:results", args=(question.id,)))
نکات مهم:
request.POSTیک دیکشنری مانند است که دادههای ارسال شده توسط فرم را در اختیار میگذارد.در صورت عدم انتخاب گزینه، با نمایش پیام خطا کاربر را راهنمایی میکنیم.
F("votes") + 1برای افزایش تعداد آراء به صورت اتمیک و جلوگیری از مشکلات رقابتی استفاده میشود.استفاده از
HttpResponseRedirectپس از POST، از ارسال دوباره فرم هنگام بارگذاری مجدد جلوگیری میکند.تابع
reverseآدرس URL صفحه نتایج را با استفاده از نام view و پارامترها میسازد.
3. ساخت View و قالب نتایج رأیگیری
برای نمایش نتایج رأیها، view سادهای به نام results تعریف میکنیم:
def results(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, "polls/results.html", {"question": question})
قالب polls/templates/polls/results.html:
{{ question.question_text }}
{% for choice in question.choice_set.all %}
- {{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}
{% endfor %}
Vote again?
نمایش پرسش و گزینهها به همراه تعداد آراء.
امکان برگشت به صفحه رأیگیری برای ثبت رأی مجدد.
4. بهینهسازی کد با استفاده از Generic Views در Django
ایجاد دستی همه view ها، مخصوصاً زمانی که مشابه هستند، تکراری و زمانبر است. Django این مشکل را با Generic Views حل کرده است.
4.1 تغییر URLconf (polls/urls.py):
from django.urls import path
from . import views
app_name = "polls"
urlpatterns = [
path("", views.IndexView.as_view(), name="index"),
path("/", views.DetailView.as_view(), name="detail"),
path("/results/", views.ResultsView.as_view(), name="results"),
path("/vote/", views.vote, name="vote"),
]
توجه: پارامتر URL از <question_id> به <pk> تغییر کرده است، زیرا Generic Views برای کلید اصلی از pk استفاده میکند.
4.2 تعریف Generic Views در polls/views.py:
from django.views import generic
from .models import Question
class IndexView(generic.ListView):
template_name = "polls/index.html"
context_object_name = "latest_question_list"
def get_queryset(self):
"""Return the last five published questions."""
return Question.objects.order_by("-pub_date")[:5]
class DetailView(generic.DetailView):
model = Question
template_name = "polls/detail.html"
class ResultsView(generic.DetailView):
model = Question
template_name = "polls/results.html"
IndexView: نمایش لیستی از پرسشها (آخرین ۵ پرسش).DetailView: نمایش جزئیات یک پرسش.ResultsView: نمایش نتایج رأیگیری برای پرسش.
مزایای استفاده از Generic Views:
کاهش حجم کد و پیچیدگی.
تمرکز روی منطق اصلی بدون نوشتن کدهای تکراری.
بهرهگیری از بهترین شیوههای توسعه وب.
5. نکات کلیدی برای توسعه Django با فرمها و Generic Views
همیشه هنگام ارسال دادههایی که روی سرور تغییر ایجاد میکنند از
POSTاستفاده کنید.برای فرمهای
POSTحتماً از{% csrf_token %}استفاده کنید تا امنیت برنامه حفظ شود.پس از موفقیت در پردازش فرم، با استفاده از
HttpResponseRedirectکاربر را به صفحه دیگری هدایت کنید تا از ارسال دوباره دادهها جلوگیری شود.Generic Views ابزار قدرتمندی هستند که میتوانند زمان توسعه را بسیار کاهش دهند و کد را تمیزتر کنند.
در URLها دقت کنید که پارامترها با نامهایی که Generic Views انتظار دارند هماهنگ باشند.
0 دیدگاه