Product matching query does not exist

i'm building a small webstore , in the product page i put the order form using FormMixin and TemplateView, when i submit the order i get a Page Not Found error "No Order matches the given query."

Bellow you can check the code

Models.py

 from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=255, unique=True, )
    description = models.TextField(max_length=1500)

    class Meta:
        verbose_name_plural = "categories"

    def __str__(self):
    return self.name


class Product(models.Model):

    name = models.CharField(max_length=255)
    description = models.TextField()
    nominal_price = models.PositiveIntegerField(verbose_name='prix normal',)
    reduced_price = models.PositiveIntegerField(blank=True, null=True)
    quantity = models.PositiveIntegerField(default=10)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='products')
    photo = models.ImageField(upload_to="img/products/", default="img/products/user_default.png")

    def __str__(self):
        return self.name

class Customer(models.Model):
full_name = models.CharField(max_length=150)
address = models.CharField(max_length=1500, null=True)
phone = models.IntegerField()
city = models.CharField(max_length=100)
email = models.EmailField(null=True)

class Order (models.Model):
    product = models.ManyToManyField(Product, through='OrderProduct')
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)

class OrderProduct(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

Views.py

class ProductDetailView(FormMixin, TemplateView):
model = Product
template_name = 'product.html'
form_class = OrderForm

def get_success_url(self):
    return reverse('index')

def post(self, request, *args, **kwargs):
    context = self.get_context_data()
    form = OrderForm(request.POST)
    if context['form'].is_valid():
        product = get_object_or_404(Order, product__name=self.kwargs['product_name'])
        customer = form.save(commit=False)
        Order.objects.create(product=product, customer=customer)
        form.save()

    return super(TemplateView, self)

def get_context_data(self, **kwargs):
    context = super(ProductDetailView, self).get_context_data(**kwargs)
    context['product'] = Product.objects.get(name=self.kwargs['product_name'])
    context['form'] = self.get_form()
    return context

forms.py

class OrderForm(forms.ModelForm):
    class Meta:
        model = Customer
        fields = ['full_name', 'address', 'phone', 'city']

urls.py

 path('', views.ProductListView.as_view(), name='index'),

Did i missed something

For handling many-to-many relations, you cannot directly set the product from Order. Also you would need to create the order first before you can set or add a product:

order = Order.objects.create(customer=customer)
order.product.add(product)
Back to Top