Django:什么是通用列表(产品)和详细视图(类别)的最佳方法

dz6r00yl  于 2023-11-20  发布在  Go
关注(0)|答案(1)|浏览(95)

类视图和函数视图哪个更好?
使用get_absolute_url还是slugify?

如何使用for以及是否在菜单中显示类别?
有些问题真的很令人困惑,不可能理解哪种方式是最好的

views.py:

class ProductView(ListView):
    template_name = 'main/Html/html_components.html'
    model = Product

class ProductCategoryView(DetailView):
    model = ProductCategory

字符串

网址:

urlpatterns = [
    path('', ProductView.as_view(), name='Product'),
    path('category/', ProductCategoryView.as_view(), name='category-detail'),
    # path('<int:pk>/', ProductCategoryView.as_view(), name='category-detail'),
    # path('category/<slug:slug>/', ProductCategoryView.as_view(), name='category-detail'),
]

html:

html(for循环)

{% load static %}

<nav class="menu__main">
    <ul class="menu">
        {% for ProductCategory in ProductCategory %}
        <li class="single">
            <a href="" class="single__link">
                <span class="single__text">{{ ProductCategory.title }}</span>
            </a>
        </li>
        <li class="dropdown">
            <a href="javascript:void(0);" class="active dropdown__link">
                <span class="dropdown__text">Forms</span>
                <svg class="dropdown__arrow"><use href="#arrow-down"></use></svg>
            </a>
            <ul class="dropdown__list">
                <li class="dropdown__list__item">
                    <a href="" class="dropdown__list__link">
                        <span class="dropdown__list__text">Checkbox</span>
                    </a>
                </li>
                <li class="dropdown__list__item">
                    <a href="" class="dropdown__list__link">
                        <span class="dropdown__list__text">Radio</span>
                    </a>
                </li>
            </ul>
        </li>
        {% endfor %}
    </ul>
</nav>

models:py

class ProductCategory(models.Model):
    title = models.CharField(max_length=100, null=False, blank=False, unique=True, verbose_name='Title')
    slug = models.SlugField(max_length=300, blank=True, unique=True, verbose_name='slug')
    create_date = models.DateTimeField(auto_now_add=True, verbose_name='Create Date')

    class Meta:
        verbose_name = 'Category'

    def __str__(self):
        return self.title

class Product(models.Model):
    title = models.CharField(max_length=200, null=False, blank=False, unique=True, verbose_name='Title')
    slug = models.SlugField(max_length=300, allow_unicode=True, null=False, blank=False, unique=True, verbose_name='slug')
    category = models.ForeignKey('ProductCategory', null=True, blank=True, db_index=True, on_delete=models.CASCADE, verbose_name='Category Parent')

    class Meta:
        verbose_name = 'Product'

    def __str__(self):
        return self.title


请告诉我速度和优化的最佳解决方案?

u5i3ibmn

u5i3ibmn1#

更好是一个相对的术语。在速度和优化方面,就像在系统性能方面一样,基于类的视图和函数式视图之间没有真实的区别。
哪一个是正确的可能取决于你打算做什么。
如果你只是想尽快启动和运行一组基本的CRUD页面,基于类的视图将帮助你用更少的代码实现。
如果你想了解Django以及它是如何工作的,我建议你先学习函数式视图,因为它们使视图对初学者来说更容易阅读。这将帮助你欣赏基于类的视图带来的好处。最终,你可能最终会使用混合视图,所以了解每种方法的部分和模式,优点和缺点将是一个优势。
slug是一行可读的文本,可以用作URL的一部分,所以你可以使用use mysite.com/product/big-chest-of-drawers而不是mysite.com/product/324。这是一种对搜索引擎有用的方法,有时也是安全的方法(因为你不能简单地通过输入id号来浏览像Users这样的对象。
get_absolute_url是一个附加到模型的方法,这样你就可以简单地调用它来获得一个moedl示例的正确链接。
为了将两者结合起来,如果您的urls.py有:

path('products/<slug:slug>/', ProductView.as_view(), name='product-detail')

字符串
你可以在你的模型中使用:

def get_absolute_url(self):
    return f"/products/{self.slug}/"


然后调用你的模板:

<a href="{{product.get_absolute_url}}">{{product.name}}</a>


现在,如果你想改变URL模式,你只需要改变前两行,每个模板仍然会在你的网站上显示正确的URL。
最后,模板中的for和ifs是这样工作的-确保For变量与Queryset的名称不同:

{% for productcat in ProductCategory %}
   {% if productcat == "fish" %}
      <p>This is a fish</p>
   {% elif productcat == "fowl" %}
      <p>This is a fowl</p>
   {% else %}
      <p>This is neither fish now fowl</p>
   {%endif %}
{% endfor %}

相关问题