我试图做一个Django网站,其中有所有的产品与他们的所有细节(每个产品都有自己的页面)。但是,由于产品太多且不断变化,我想根据数据库模型(models.py)自动创建和删除页面。我应该使用基于类的视图吗?我是不是应该使用一个带循环的基于函数的视图?
# models.py
import uuid
from django.db import models
class Brand(models.Model):
brand_id = models.AutoField(primary_key=True, unique=True)
brand_name = models.CharField(max_length=100, unique=True)
class Product(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=100, null=False, blank=False)
brand_id = models.ForeignKey(Brand)
# A lot more columns will follow (didn't lock on them yet)
# This is what I had thought of initially 发布于 2020-06-26 06:09:19
如果我理解您要做的事情(自动创建产品页面),您可以覆盖Products模型中的save方法,以便在每次添加产品时创建一个新页面,然后在外键中使用models.CASCADE,以便在删除产品时删除相关页面,如下所示:
from django.utils.text import slugify
class Page(models.Model):
product = models.ForeignKey('Product', on_delete=models.CASCADE)
...
class Product(models.Model):
name = models.CharField(max_length=255)
slug = models.SlugField(blank=True, null=True)
...
def save(self, *args, **kwargs):
self.slug = slugify(instance.name)
page = Page.objects.create(product=self,...)
page.save()
super(GeeksModel, self).save(*args, **kwargs)您还可以使用Django信号,就像在models.py文件中一样:
@receiver(post_save, sender=Product)
def create_product_page(sender, instance, created, **kwargs):
if created:
instance.slug = slugify(instance.name)
page = Page.objects.create(product=instance,...)
page.save()
instance.save()例如,在您的views.py中,要获取一个页面:
def product_page(request, product_id, product_slug):
page = Page.objects.get(product__id=product_id)
...
context = {
'page_data': page
}
return render(request, 'page_template.html', context)在自定义产品页面的urls.py中:
...
path('/products/pages/<int:product_id>/<str:product_slug>/', product_page, name="product_page")
...因此,url将如下所示:
http://example.com/products/pages/3/my-amazing-widget/如果您在模板中动态创建了链接,如下所示:
{% for product in products %}
<p><a href='{% url 'product_page' product.id product.slug %}'>{{ product.name }}</a></p>
{% endfor %}还有其他的方法。在上面的模型示例中,我还包含了一个可以用来生成自定义SlugField的URL。如果你详细说明你的问题,我可以更新我的答案。
https://stackoverflow.com/questions/62584905
复制相似问题