вот моя проблема, я хотел добавить продукты с категорией, такой как интерфейс администратора, но со страницы создания моего продукта. я создал модели, формы и представления для категории, но она не работает ... как это сделать?
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, null=True,
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, попытался также удалить миграции и db. после удаления миграций он работает (но не ПОСТОЯННО, показывает то же самое для следующей 2-й или 3-й отправки), но ничего не показывает на странице списка продуктов
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",
"class": "new-class-name two",
"id": "my-id-for-textarea",
"rows": 5,
'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='', 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",
"class": "new-class-name two",
"id": "my-id-for-textarea",
"rows": 5,
'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, 'products/product_create.html', context)
def product_detail_view(request, id):
obj = get_object_or_404(Product, id=id, user=request.user)
context = {
'object': obj
}
return render(request, "products/product_detail.html", context)
def product_delete_view(request, id):
obj = get_object_or_404(Product, id=id, 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, 'products/product_list.html', 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>