• 1400/02/26

سبد خرید :

سلام خسته نباشید 

من تو قسمت افزودن به سبد خرید میخواستم تعدادی که کاربر از یک محصول انتخاب میکنه بیشتر از تعداد موجود اون محصول نباشه یعنی برای input مقدار max انتخاب کنم ولی چون این input رو از فرم میگیرم نمیدونم چطور باید مقدار max بدم 

ممنون میشم راهنمایی بفرمایید

  • 1400/02/26
  • ساعت 12:00

سلام وقت بخیر

این مورد رو توی بکند کنترل کنید نه توی فرمتون 

شما به input تون مقدار max هم بدید در نهایت میتونه سمت فرانت اون رو تغییر بده

وقتی افزودن به سبد خرید داره اتفاق میفته بررسی کنید که اگر مقدار محصول بیشتر از موجودی کالا بود یه اروری روی صفحه نمایش بده مثلا بگه مقدار افزوده بیشتر از موجودی می باشد .

اینم یه لینک برای افزودن max value به یک فیلد

https://stackoverflow.com/questions/3470741/django-forms-integerfield-set-max-value-on-runtime

همچنین میتونید از این پکیج 

https://pypi.org/project/django-widget-tweaks/

هم استفاده کنید برای افزودن attribute و class به فرم ها توی template استفاده میشه


  • 1400/03/12
  • ساعت 15:55

با سلام خدمت جناب اردوخانی

سایت https://digipackshop.ir را طراحی کردم فقط در قسمت سبد خرید که مشاهده بفرمایید در قسمت اطلاعات شخصی شما مشخصات کاربر و آدرس و شماره تماس و بقیه موارد که در سایت وارد می کند مشکلی ندارد و به صفحه پرداخت بانک هم منتقل می شود فقط اطلاعات آدرس و تلفن و کد پستی و بقیه موارد در ادمین نشان داده نمی شود ممنون راهنمایی بفرمایید مشکل از کجاست. 

تمامی کدها را در زیر آورده ام ممنون از شما و مجموعه خوب سایت تاپ لرن

forms.py

from django import forms
from django.contrib.auth.models import User
from django.core import validators


class UserNewOrderForm(forms.Form):
    product_id = forms.IntegerField(
        widget=forms.HiddenInput(),
    )

    count = forms.IntegerField(
        widget=forms.NumberInput(),
        initial=1
    )


class CreateOrderForm(forms.Form):
    full_name = forms.CharField(
        widget=forms.TextInput(
            attrs={'placeholder': 'لطفا نام و نام خانوادگی خود را وارد نمایید', 'class': 'form-control'}),
        label='نام و نام خانوادگی',
        validators=[
            validators.MaxLengthValidator(50, 'نام و نام خانوادگی شما نمیتواند بیشتر از 50 کاراکتر باشد')
        ]
    )

    address = forms.CharField(
        widget=forms.TextInput(attrs={'placeholder': 'لطفا آدرس خود را وارد نمایید', 'class': 'form-control'}),
        label='آدرس',
        validators=[
            validators.MaxLengthValidator(100, 'آدرس شما نمیتواند بیشتر از 100 کاراکتر باشد')
        ]
    )

    email = forms.EmailField(
        widget=forms.EmailInput(attrs={'placeholder': 'لطفا ایمیل خود را وارد نمایید', 'class': 'form-control'}),
        label='ایمیل',
        validators=[
            validators.MaxLengthValidator(100, 'ایمیل شما نمیتواند بیشتر از 100 کاراکتر باشد')
        ]
    )

    country = forms.CharField(
        widget=forms.TextInput(attrs={'placeholder': 'لطفا کشور خود را وارد نمایید', 'class': 'form-control'}),
        label='کشور',
        validators=[
            validators.MaxLengthValidator(100, 'آدرس شما نمیتواند بیشتر از 100 کاراکتر باشد')

        ]
    )

    city = forms.CharField(
        widget=forms.TextInput(attrs={'placeholder': 'لطفا شهر خود را وارد نمایید', 'class': 'form-control'}),
        label='شهر',
        validators=[
            validators.MaxLengthValidator(40, 'آدرس شما نمیتواند بیشتر از 40 کاراکتر باشد')
        ]
    )

    postal = forms.CharField(
        widget=forms.TextInput(attrs={'placeholder': 'لطفا کدپستی خود را وارد نمایید', 'class': 'form-control'}),
        label='کدپستی',
        validators=[
            validators.MaxLengthValidator(10, 'کدپستی شما نمیتواند بیشتر از 10 رقم باشد'),
            validators.MinLengthValidator(10, 'کدپستی شما نمیتواند کمتر از 10 رقم باشد'),
        ]
    )

    phone = forms.CharField(
        widget=forms.TextInput(attrs={'placeholder': 'لطفا تلفن تماس خود را وارد نمایید', 'class': 'form-control'}),
        label='تلفن',
        validators=[
            validators.MaxLengthValidator(100, 'آدرس شما نمیتواند بیشتر از 100 کاراکتر باشد')
        ]
    )

    def clean_full_name(self):
        full_name = self.cleaned_data.get('full_name')
        is_exists_user_by_fullname = User.objects.filter(fullname=full_name).exists()

        if is_exists_user_by_fullname:
            raise forms.ValidationError('این  نام و نام خانوادگی قبلا ثبت نام کرده است')

        return full_name

    def clean_email(self):
        email = self.cleaned_data.get('email')
        is_exists_user_by_email = User.objects.filter(email=email).exists()
        if is_exists_user_by_email:
            raise forms.ValidationError('ایمیل وارد شده تکراری میباشد')

        if len(email) > 50:
            raise forms.ValidationError('تعداد کاراکترهای ایمیل باید کمتر از 50 باشد')

        return email

views.py

import time
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, Http404
from django.shortcuts import render, redirect
from zeep import Client
from eshop_order.forms import UserNewOrderForm, CreateOrderForm
from eshop_order.models import Order, OrderDetail, OrderForm
from eshop_products.models import Product


@login_required(login_url="/login")
def add_user_order(request):
    new_order_form = UserNewOrderForm(request.POST or None)
    if new_order_form.is_valid():
        order = Order.objects.filter(owner_id=request.user.id, is_paid=False).first()

        if order is None:
            order = Order.objects.create(owner_id=request.user.id, is_paid=False)

        product_id = new_order_form.cleaned_data.get('product_id')
        count = new_order_form.cleaned_data.get('count')
        product = Product.objects.get(id=product_id)

        if count < 1:
            count = 1

        try:
            order_detail = OrderDetail.objects.get_queryset().get(order__owner_id=request.user.id, product=product)
            order_detail.count += count
            order_detail.save()
            messages.success(request, 'محصول با موفقیت به سبد خرید شما اضافه شد', 'success')
            return redirect(f"/products/{product.id}/{product.title.replace(' ', '-')}")
        except OrderDetail.DoesNotExist:
            order.orderdetail_set.create(product=product, discount=product.discount, count=count,
                                         order=request.user.get_full_name())
            messages.success(request, 'محصول با موفقیت به سبد خرید شما اضافه شد', 'success')
            return redirect(f"/products/{product.id}/{product.title.replace(' ', '-')}")


@login_required(login_url='/login')
def user_open_order(request, *args, **kwargs):
    order_form = CreateOrderForm(request.POST or None)

    if order_form.is_valid():
        full_name = order_form.cleaned_data.get('full_name')
        email = order_form.cleaned_data.get('email')
        address = order_form.cleaned_data.get('address')
        city = order_form.cleaned_data.get('country')
        postal = order_form.cleaned_data.get('postal')
        phone = order_form.cleaned_data.get('phone')
        country = order_form.cleaned_data.get('country')
        OrderForm.objects.create(full_name=full_name, email=email, address=address, country=country, city=city,
                                 postal=postal, phone=phone)
        order_form = CreateOrderForm()

    context = {
        'order': None,
        'details': None,
        'order_form': order_form,
        'total': 0
    }

    open_order: Order = Order.objects.filter(owner_id=request.user.id, is_paid=False).first()
    if open_order is not None:
        context['order'] = open_order
        context['OrderForm'] = open_order
        context['details'] = open_order.orderdetail_set.all()
        context['total'] = open_order.get_total_discount()

    return render(request, 'order/user_open_order.html', context)


@login_required(login_url='/login')
def remove_order_detail(request, *args, **kwargs):
    detail_id = kwargs.get('detail_id')
    if detail_id is not None:
        order_detail = OrderDetail.objects.get_queryset().get(id=detail_id, order__owner_id=request.user.id)
        if order_detail is not None:
            order_detail.delete()
            return redirect('/open-order')
    raise Http404()


MERCHANT = '8d5638d8-73f2-11e9-b0b6-000c29344814'
amount = 1000  # Toman / Required
description = "توضیحات مربوط به تراکنش را در این قسمت وارد کنید"  # Required
email = 'email@example.com'  # Optional
mobile = '09123456789'  # Optional

client = Client('https://www.zarinpal.com/pg/services/WebGate/wsdl')
CallbackURL = 'http://localhost:8000/verify'  # Important: need to edit for realy server.


def send_request(request, *args, **kwargs):
    total_discount = 0
    open_order: OrderDetail = Order.objects.filter(is_paid=False, owner_id=request.user.id).first()
    if open_order is not None:
        total_discount = open_order.get_total_discount()
        result = client.service.PaymentRequest(
            MERCHANT, total_discount, description, email, mobile, f"{CallbackURL}/{open_order.id}"
        )
        if result.Status == 100:
            return redirect('https://www.zarinpal.com/pg/StartPay/' + str(result.Authority))
        else:
            return HttpResponse('Error code: ' + str(result.Status))
    raise Http404()


def verify(request, *args, **kwargs):
    order_id = kwargs.get('order_id')
    if request.GET.get('Status') == 'OK':
        result = client.service.PaymentVerification(MERCHANT, request.GET['Authority'], amount)
        if result.Status == 100:
            user_order = Order.objects.get_queryset().get(id=order_id)
            user_order.is_paid = True
            user_order.payment_date = time.time()
            user_order.save()
            return HttpResponse('Transaction success.\nRefID: ' + str(result.RefID))
        elif result.Status == 101:
            return HttpResponse('Transaction submitted : ' + str(result.Status))
        else:
            return HttpResponse('Transaction failed.\nStatus: ' + str(result.Status))
    else:
        return HttpResponse('Transaction failed or canceled by user')

models.py

from django.contrib.auth.models import User
from django.db import models
from eshop_products.models import Product


class Order(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='نام و نام خانوادگی')
    is_paid = models.BooleanField(verbose_name='پرداخت شده / نشده')
    payment_date = models.DateTimeField(blank=True, null=True, verbose_name='تاریخ پرداخت')

    class Meta:
        verbose_name = 'سبد خرید'
        verbose_name_plural = 'سبدهای خرید کاربران'

    def __str__(self):
        return self.owner.get_username()

    def get_total_discount(self):
        amount = 0
        for detail in self.orderdetail_set.all():
            amount += detail.discount * detail.count
        return amount


class OrderDetail(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE, verbose_name='نام کاربر ')
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='محصول')
    discount = models.IntegerField(verbose_name='قیمت محصول')
    count = models.IntegerField(verbose_name='تعداد')

    def get_detail_sum(self):
        return self.count * self.discount

    class Meta:
        verbose_name = 'جزییات محصول'
        verbose_name_plural = 'اطلاعات جزییات محصولات'

    def __str__(self):
        return self.product.title


class OrderForm(models.Model):
    full_name = models.CharField(max_length=150, verbose_name='نام و نام خانوادگی')
    address = models.CharField(max_length=200, verbose_name='آدرس')
    email = models.EmailField(max_length=100, verbose_name='ایمیل')
    city = models.CharField(max_length=100, verbose_name='شهر')
    country = models.CharField(max_length=100, blank=True, verbose_name='کشور')
    postal = models.IntegerField(verbose_name='کدپستی')
    phone = models.IntegerField(verbose_name='تلفن')

    class Meta:
        verbose_name = 'جزییات محصول کاربر'
        verbose_name_plural = 'اطلاعات جزییات محصولات کاربران'

    def __str__(self):
        return self.address

admin.py

from django.contrib import admin
# Register your models here.
from eshop_order.models import Order, OrderDetail, OrderForm


@admin.register(OrderDetail)
class OrderDetailAdmin(admin.ModelAdmin):
    list_display = ['product', 'order', 'discount', 'count']
    search_fields = ['product', 'order']


@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = ['owner', 'is_paid', 'payment_date']


@admin.register(OrderForm)
class orderAdmin(admin.ModelAdmin):
    list_display = ['__str__', 'full_name', 'email', 'address', 'city', 'phone', 'country']


  • 1400/03/17
  • ساعت 16:50

روز بخیرشما برای اینکه اطلاعاتتون تو ادمین نمایش داده شه باید آدرس و تلفن و غیره رو به یوزر اضافه کنید در واقع باید یوزر خودتون رو extend کنید 

یکی از راه های اینکار استفاده از onetoonefield هستش میتونبد مطلب زیر رو در گوگل سرچ کنید و راه حل رو بصورت کامل پیدا کنید how to extrnds django user


logo-samandehi