13- ساخت اولین اپلیکیشن در جنگو(4) (صفحه ادمین):

۰۸ تیر ۱۴۰۴
0 دیدگاه

آموزش ساخت اولین اپلیکیشن Django – بخش چهارم: فرم‌ها، پردازش داده و استفاده از Generic Views

در این بخش از آموزش، که ادامه‌ی بخش قبلی (بخش سوم) است، اپلیکیشن وب‌پول (web-poll) را توسعه می‌دهیم و به پردازش فرم‌ها و بهینه‌سازی کد با استفاده از Generic Views می‌پردازیم.


 

 

1. ایجاد یک فرم ساده (Minimal Form)

 

برای ثبت رأی کاربران، ابتدا باید در قالب (template) مربوط به جزئیات یک پرسش (poll)، یک فرم HTML ایجاد کنیم.

 

کد نمونه در polls/templates/polls/detail.html:

html

				
					<form action="{% url 'polls:vote' question.id %}" method="post">
  {% csrf_token %}
  <fieldset>
    <legend><h1>{{ question.question_text }}</h1></legend>
    {% if error_message %}
      <p><strong>{{ error_message }}</strong></p>
    {% endif %}
    {% for choice in question.choice_set.all %}
      <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
      <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
    {% endfor %}
  </fieldset>
  <input type="submit" value="Vote">
</form>

				
			

نکات مهم:

  • هر گزینه (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:

				
					<h1>{{ question.question_text }}</h1>

<ul>
  {% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
  {% endfor %}
</ul>

<a href="{% url 'polls:detail' question.id %}">Vote again?</a>

				
			
  • نمایش پرسش و گزینه‌ها به همراه تعداد آراء.

  • امکان برگشت به صفحه رأی‌گیری برای ثبت رأی مجدد.


 

 

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("<int:pk>/", views.DetailView.as_view(), name="detail"),
    path("<int:pk>/results/", views.ResultsView.as_view(), name="results"),
    path("<int:question_id>/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 انتظار دارند هماهنگ باشند.


 

 

جمع‌بندی

 

در این بخش با نحوه ایجاد فرم‌ها در قالب‌های Django، پردازش داده‌های ارسال شده، نمایش نتایج و در نهایت بهینه‌سازی کد با استفاده از Generic Views آشنا شدید. این مراحل کلیدی در توسعه اپلیکیشن‌های وب با Django هستند و تسلط بر آنها به ساخت برنامه‌های حرفه‌ای کمک می‌کند.

0 دیدگاه