كيف اربط Product مع Order في خطوتين منفصلتين في جانقو

from django.db import models
from django.urls import reverse
from decimal import Decimal


class Category(models.Model):

    name = models.CharField(max_length=200,db_index=True)
    slug = models.SlugField(max_length=200,db_index=True,unique=True)

    class Meta:
        ordering = ('name',)
        verbose_name = "Category"
        verbose_name_plural = "Categorys"

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('product_list_category',args=[self.slug])

class Product(models.Model): 

    category=models.ForeignKey(Category,related_name='product')
    product_name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200,db_index=True)
    product_details = models.TextField()
    price = models.IntegerField()
    active = models.IntegerField(default='1')
    stock = models.PositiveIntegerField()
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
           ordering = ('-created',)
           index_together = (('id','slug'),)
           verbose_name = "Product"
           verbose_name_plural = "Products"

    def __str__(self):
       return self.product_name

    def get_absolute_url(self):
        return reverse('product_detail',args=[self.id,self.slug])



class Order (models.Model):

    name = models.CharField(max_length=200)
    product = models.ManyToManyField(Product, related_name='items')
    phone = models.CharField(max_length=20)
    address = models.TextField()
    payment_option = models.CharField(max_length=50)
    order_status = models.CharField(max_length=50)
    quantity = models.PositiveIntegerField(default=1)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    price = models.DecimalField(max_digits=10,decimal_places=2)


    class Meta:
        ordering = ('name',)

    def __str__(self):
          return self.name

    def get_cost(self):
        return self.price * self.quantity

form

كلاس order يكون لها اثنين from . حيث جزاء من بيانات هذا الكلاس سيتم إدخالها من صفحة والجزاء الآخر من صفحه أخرى

الفورم الأول يدخل بيانات المشتري ونوع الشراء

class OrderForm(ModelForm):
            OPTIONS = (
           
            )
          OPTIONS2 = (
         
         )
   order_status = forms.TypedChoiceField(required=False, choices=OPTIONS2, 
    widget=forms.RadioSelect)
    payment_option = forms.ChoiceField(choices=OPTIONS)

class Meta:
    model = Order
    fields = ['name','phone','address','payment_option','order_status']

الفورم الثاني يدخل رقم product والكمية . في صفحة أخرى مستقله تعرض كل ال product.

  class CartAddProductForm(forms.Form):
      # TODO: Define form fields here
       quantity = 
       forms.TypedChoiceField(choices=PRODUCT_QUANTITY_CHOICES,coerce=int)
       update = forms.BooleanField(required=False,initial=False,widget=forms.HiddenInput)

المشكلة وارجو المساعدة .
كيف سيكون كود الview . الذي يقوم باستقبال بيانات ٢فورم من صفحات مختلفة . وإضافة إلى database

2 Likes

@enas_mohamed

2 Likes

أهلا @radi

أولا يجب أن يكون لديك view لكل صفحة و لتمرير البيانات بينهما يمكنك استعمال ال session كالتالي

أولا order view

def order(request):
   if request.method == 'POST':    
        form = OrderForm(request.POST, request.FILES)
        if form.is_valid():
            request.session['order_form'] = form
            return redirect('cart')
    else:
        form = OrderForm()

    return render(request, 'order.html', {'form': form})
 

ثم في cart view

def cart(request): 
    order_form = request.session.get('order_form')   
    ...

الكود غير كامل … فقط لتوضيح الفكرة :grin:

بالتوفيق صديقي

2 Likes

بالأمس كنت اناقش المشكلة مع هشام وتوصلنا إلى شيء

جوهر المشكلة يأتي من طريقة تعاملك مع المجال (التسوق الالكتروني)…

بمعنى عندك في المودل Product و Order، لكن لما احنا نروح للسوبر ماركت لازمنا شيء اضافي، ماهو؟

نحتاج “عربة تسوق” لكي نملئ فيها ما نريد شرائه (items) والعربة بكاملها ستذهب الى اتمام الطلب Order.

مرة أخبرتني أسماء @asmaa_salih بمكتبة رائعة اسمها django-oscar مبرمجها تعامل مع المجال بشكل رائع.

اعتقد ان أسماء لديها أيضا اضافة كون لديها خبرة سابقة بإنشاء متجر :smile:

4 Likes

شكرا @hichem2h وشكرا @YaserAlnajjar وشكرا @sniperadmin .
على وقتكم وجهودكم . دمتم سالمين

1 Like

أخي كما أشار بشمهندس ياسر انك تحتاج ان يكون لديك حاويه (cart) يضاف اليها المنتجات اولا قبل الانتقال لعمل الطلب وادخال المستخدم للبيانات ولذلك عليك عمل cart views
وفيها بإمكانك أولا عمل session sessions

class Cart(object):
     def __init__(self):
        self.session = request.session

     def add(self,product):
        ...
        ...

     def remove(self,product):
      ...
      ...

وايضا يمكن للمستخدم اضافه او تحديث او حذف منتجات
وهنا يمكن استخدام ال CartAddProductForm لاضافه منتج الى العربه
بعد ذلك يمكنك عمل order views واستخدام OrderForm
انا كنت اعمل على نفس الموضوع منذ شهر اذا احتجت أي توضيح
موفق ان شاء الله

4 Likes

نعم @asmaa_salih ياليت في توضيح اكثز :blush:

ما الذي تريد توضيحة وانا سأساعدك ان شاء الله

1 Like