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 دیدگاه