Как создать продукт с категорией и показать категории в списке продуктов вместе с загруженным продуктом - PullRequest
0 голосов
/ 10 ноября 2019

вот моя проблема, я хотел добавить продукты с категорией, такой как интерфейс администратора, но со страницы создания моего продукта. я создал модели, формы и представления для категории, но она не работает ... как это сделать?

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...