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