Используйте ManyToManyField как слаг в URL - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь, чтобы в моем URL была указана категория и название продукта. Вместо того, чтобы использовать ForeignKey, чтобы назначить категорию для продукта, я выбрал ManyToManyField, потому что некоторые продукты принадлежат нескольким категориям. Если я нахожусь, чтобы сказать http://127.0.0.1:8000/products/shirts/tshirt/. Я получаю Invalid field name(s) given in select_related: 'category'. Choices are: (none)

. Я также получаю сообщение об ошибке при вводе go на страницу сведений о категории, например http://127.0.0.1:8000/products/shirts/.

Reverse for 'model_detail_view' with arguments '('', 'tshirt')' not found. 1 pattern(s) tried: ['products/(?P<category_slug>[^/]+)/(?P<model_slug>[^/]+)/$']

models.py

class Product(models.Model): 
    title = models.CharField(max_length=80)
    category = models.ManyToManyField(Category)
    model_slug = AutoSlugField(null=True, default=None,
                         unique=True, populate_from='title')

    class Meta:
        verbose_name_plural = "Products"

    def __str__(self):
        return self.title

views.py

def model_category_detail_view(request, category_slug):
    category = get_object_or_404(Category, category_slug=category_slug)
    context = {
        "products": Product.objects.filter(category__category_slug=category_slug),
    }
    return render(request=request,
                  template_name='main/category_detail.html', context=context)

def model_detail_view(request, category_slug, model_slug):
    products = Product.objects.select_related('category').get(
        category__category_slug=category_slug, model_slug=model_slug)
    context = {
        "products": products,
    }
    return render(request=request, template_name='main/model_detail.html', context=context)

urls.py

path("products/<str:category_slug>/<str:model_slug>/", views.model_detail_view, name="model_detail_view"),

шаблон

{% for product in products %}
    <a class="btn btn-outline" href="{% url 'main:model_detail_view' product.category.category_slug product.model_slug %}"><i class="fa fa-arrow-circle-right"></i>View Model</a>
{% endfor %}
...