如何创建具有类别的产品,并在产品列表中显示类别以及已上传的产品

这是我的问题,我想从产品创建页面添加具有管理界面等类别的产品。我创建了模型,表格和视图  类别,但不起作用...该怎么做?

models.py

#added category model 
class Category(models.Model):
    name = models.CharField(max_length=150,db_index=True)
    slug = models.SlugField(max_length=150,unique=True,db_index=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL,null=True,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class Product(models.Model):
   # added category as a foregn key 
    category = models.ForeignKey(Category,related_name='product',on_delete=models.CASCADE)
    title = models.CharField(max_length=120) 
    description = models.TextField(blank=True,null=True)
    price = models.DecimalField(decimal_places=2,max_digits=10000)
    summary = models.TextField(blank=False,null=False)
    featured = models.BooleanField(default=False) # null=True,default=True
    slug=models.SlugField(unique=True)
    user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)

    def get_absolute_url(self):
        return reverse("products:product-detail",kwargs={"id": self.id}) 

forms.py #在提交表单时说不是NULL约束        失败:: products_product.category_id,尝试通过删除迁移来进行       和分贝。删除迁移后,它可以正常工作(但不能       永久显示下一个第二或第三次提交的内容相同),但显示      产品列表页面中没有任何内容

class ProductForm(forms.ModelForm):
    title       = forms.CharField(label='',widget=forms.TextInput(attrs= 
     {"placeholder": "Product Name"}))
    description = forms.CharField(
                        required=False,widget=forms.Textarea(
                                attrs={
                                    "placeholder": "Your description","class": "new-class-name two","id": "my-id-for-textarea","rows": 5,'cols': 50
                               }
                            )
                        )
    summary = forms.CharField(
                        required=False,widget=forms.Textarea(
                               attrs={

                                    "placeholder": "Your summary",'cols': 50
                                }
                            )
                        )  

    price       = forms.DecimalField(initial=199.99)

    slug        =forms.SlugField(max_length=50)

    class Meta:
        model = Product
        fields = [
            'title','description','summary','price','slug'
      ]


class RawProductForm(forms.Form):
    title       = forms.CharField(label='','cols': 50
                                }
                        )
                    )
    summary = forms.CharField(
                    required=False,widget=forms.Textarea(
                            attrs={
                                "placeholder": "Your summary",'cols': 50
                               }
                            )
                        )  

    price       = forms.DecimalField(initial=0.00)

#added category form   
class CategoryForm(forms.ModelForm):
    name = forms.CharField(label='',widget=forms.TextInput(attrs= 
              {"placeholder": "product Category"}))
    slug = forms.SlugField(max_length=50)

    class Meta:
        model = Category
        fields = [
            'name','slug'
        ]

views.py

 # created the create_view for showing both the forms in the product create 
     page**
   def product_create_view(request):
        if request.method == 'POST':
            form = ProductForm(request.POST)
            category_form = CategoryForm(request.POST)
            if form.is_valid()and category_form.is_valid():
                form.save()
                category_form.save()
                form.instance.user = request.user
                category_form.instance.user = request.user
                return HttpResponseRedirect('/success')

            else:
                context = {
                    'form': ProductForm,'category_form': CategoryForm,}

        else:
            context = {
                'form': ProductForm(),'category_form': CategoryForm(),}

        return render(request,'products/product_create.html',context)


    def product_update_view(request,id):
        obj = get_object_or_404(Product,id=id,user=request.user)
        if request.method == 'POST':
            form = ProductForm(request.POST,instance=obj)
            if form.is_valid():
               form.instance.user = request.user
                form.save()
        else:
            form = ProductForm(instance=obj)
        context = {
            'form': form
        }
        return render(request,context)


    def product_detail_view(request,user=request.user)
        context = {
            'object': obj
        }
        return render(request,"products/product_detail.html",context)

    def product_delete_view(request,user=request.user)
        if request.method == "POST":
            obj.delete()
            return redirect('../../')
        context = {
            'object': obj
        }
        return render(request,'products/product_delete.html',context)

       def product_list_view(request):
            queryset = Product.objects.filter(user=request.user)
            categories = Category.objects.all()
            context = {
                'object_list': queryset,'categories': categories
            }
            return render(request,'products/product_list.html',context)

        #tried by creating this view for category list view**

    def product_list_by_category(request,slug=None):
        categories = Category.objects.all()
        queryset = Product.objects.filter(user=request.user)
        if slug !=None:
            category = Category.objects.get(slug=slug)
            queryset = Product.objects.filter(category=category)

        context = {
            'category': category,'categories': categories,'object_list': queryset
        }
        return render(request,context)

product-list.html         #这是试图在左侧显示类别的html页面      该页面以及特定用户上传的所有产品***

{% extends 'accounts/base.html' %}
{% block content %}
    <!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
</head>
<body>
    <div class="container">
<div class="row">
<div class="col-sm-4">
    <!-- Category -->
    <div class="single category">
        <h3 class="side-title">Category</h3>
        <ul class="list-unstyled">
            <li><a href="{% url 'products:product-list' %}" title="">All 
               <span class="pull-right"></span></a></li>
        {% for c in categories %}
         <li><a href="{% url 'products:products' slug=c.slug %}">{c.name</a> 
        </li>
            {% endfor %}

 </ul>
 </div>
 </div>
</div>
</div>
{% for instance in object_list %}
     <p>{{ instance.id }} - <a href='{{ instance.get_absolute_url }}'>{{ 
 instance.title }}</a> <a href="{% url 'products:product-delete' instance.id 
%}">Delete</a>   <a href="{% url 'products:product-update' instance.id 
%}">Update</a> </p>  
{% endfor %}
{% endblock %}

    </body>
    </html>
longlong_z 回答:如何创建具有类别的产品,并在产品列表中显示类别以及已上传的产品

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3128751.html

大家都在问