فروشگاه آنلاین


احتمالا شما هم تا به حال از یک فروشگاه آنلاین خرید کرده‌اید. در هر فروشگاه آنلاین یک سبد خرید یا cart وجود دارد که محصولات انتخاب شده در آن نمایش داده می‌شوند و برای هر محصول می‌توان بعضی خصوصیات آن محصول مانند تعداد، رنگ و ... را تغییر داد. حال ما می‌خواهیم یک فروشگاه آنلاین بنویسیم و قسمتی از پروژه را نیز نوشته‌ایم و از شما می‌خواهیم در نوشتن فرمِ سبد خرید به ما کمک کنید. پروژه‌ی فعلی را میتوانید از این لینک دانلود کنید.

همانطور که می‌بینید، در پروژه یک app به نام shop و در آن دو مدل Color و Product وجود دارد.

در فایل forms.py یک فرم با نام CartForm وجود دارد که شما باید این کلاس را به شکل زیر تکمیل کنید.

توجه: در ورودی kwargs تابع __init__ یک کلید به نام items وجود دارد که لیست product ها را نشان می‌دهد.

اضافه کردن فیلد‌ها🔗

شما باید به ازای هر product ای که به فرم شما پاس داده می‌شود، دو فیلد تعداد و رنگ را به شکل زیر قرار دهید:

  • تعداد: این فیلد باید از نوع IntegerField باشد و نام آن number_<product.id> باشد که در آن <product.id> آیدی آن محصول است. برای این فیلد، باید مقدار پیشفرض ۱ را در نظر بگیرید. و label آن هم باید نام محصول باشد.
  • رنگ: این فیلد از نوع ChoiceField می‌باشد و نام آن color_<product.id> است که در آن <product.id> آیدی آن محصول است. این فیلد لیستی از رنگ‌های موجود برای محصول خاص را نشان می‌دهد. مقدار label این فیلد هم باید 'color' باشد. تضمین می‌شود که هیچ محصولی بدون رنگ نیست.

موارد خواسته شده باید در تابع __init__ به self.fields اضافه شوند. هم‌چنین به ازای هر دو مورد بالا مقدار required باید False باشد.

توجه کنید که هر دو این فیلدها در نهایت حتما باید مقدار داشته باشند بدین معنی که اگر در request.POST داده برای یک فیلد فرستاده نشد، باید خودتان برایش مقداری قرار دهید. برای فیلدهای "تعداد" مقدار ۱ و برای فیلدهای "رنگ"، کوچکترین رنگ موجود در لیست رنگ‌های آن کالا (از نظر الفبایی) باید قرار بگیرد.

برای مثال:🔗

>>> product.id
    5
>>> product.colors_available
    {'red', 'blue', 'white'}
Plain text

حال یک درخواست POST با داده های خالی {} ارسال می‌شود. در این صورت باید بعد از ایجاد فرم و صدا شدن تابع ()is_valid، متغییر cleaned_data به شکل زیر باشد:

{'number_5' = 1, 'color_5' = 'blue'}
Plain text

زیرا رنگ blue از نظر الفبایی از دو رنگ دیگر کوچکتر است.

در فایل views.py یک تابع به نام make_json قرار دارد که cleand_data فرم مورد نظر را به شکل json با فرمت خاص برمی‌گرداند. نیازی نیست شما در این تابع تغییری ایجاد کنید یا از آن استفاده کنید.

فایل آپلودی

یک فایل zip. که درون آن یک پوشه shop وجود دارد که شامل یک فایل forms.py است. توجه کنید در صورتی که فایل‌های اضافی ارسال کنید، حذف خواهند شد.

<Your-zip-name>.zip
   └── shop
        └── forms.py
Plain text