在Django中创建记录时,有没有一种方法可以自动创建页面(和slug)

在Django中创建记录时,有没有一种方法可以自动创建页面(和slug),django,django-models,django-views,Django,Django Models,Django Views,我正在尝试制作一个Django网站,其中包含所有产品及其所有详细信息(每个产品都有自己的页面)。但是,由于有太多的产品并且它们不断变化,我想根据数据库模型(models.py)自动创建和删除页面。 我应该使用基于类的视图吗?我应该使用基于函数的视图,其中包含一个循环吗 #models.py 导入uuid 从django.db导入模型 类别品牌(型号.型号): 品牌标识=models.AutoField(主键=True,唯一键=True) brand_name=models.CharField(最

我正在尝试制作一个Django网站,其中包含所有产品及其所有详细信息(每个产品都有自己的页面)。但是,由于有太多的产品并且它们不断变化,我想根据数据库模型(models.py)自动创建和删除页面。 我应该使用基于类的视图吗?我应该使用基于函数的视图,其中包含一个循环吗

#models.py
导入uuid
从django.db导入模型
类别品牌(型号.型号):
品牌标识=models.AutoField(主键=True,唯一键=True)
brand_name=models.CharField(最大长度=100,唯一性=True)
类别产品(型号.型号):
id=models.UUIDField(主键=True,默认值=uuid.uuid4,可编辑=False)
name=models.CharField(最大长度=100,null=False,blank=False)
品牌标识=型号。外键(品牌)
#接下来会有更多的列(尚未锁定)
#这就是我最初的想法

如果我了解您试图做什么(自动创建产品页面),您可以覆盖产品模型中的
保存
方法,在每次添加产品时创建一个新页面,然后使用外键中的
模型。级联
,以便在删除产品时删除相关页面,如下所示:

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()
例如,在your 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)
在自定义产品页面的URL.py中:

...
path('/products/pages/<int:product_id>/<str:product_slug>/', product_page, name="product_page")
...
如果在模板中使用以下内容动态创建链接:

{% for product in products %}
    <p><a href='{% url 'product_page' product.id product.slug %}'>{{ product.name }}</a></p>
{% endfor %}
{%用于产品中的产品%}

{%endfor%}

还有其他的方法。在上面的模型示例中,我包含了一个SlugField,您也可以使用它生成自定义URL。如果您详细说明您的问题,我可以更新我的答案。

如果我了解您试图做什么(自动创建产品页面),您可以覆盖产品模型中的
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()
例如,在your 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)
在自定义产品页面的URL.py中:

...
path('/products/pages/<int:product_id>/<str:product_slug>/', product_page, name="product_page")
...
如果在模板中使用以下内容动态创建链接:

{% for product in products %}
    <p><a href='{% url 'product_page' product.id product.slug %}'>{{ product.name }}</a></p>
{% endfor %}
{%用于产品中的产品%}

{%endfor%}

还有其他的方法。在上面的模型示例中,我包含了一个SlugField,您也可以使用它生成自定义URL。如果您详细说明您的问题,我可以更新我的答案。

请发布更多详细信息和您当前使用的示例代码。您为什么要尝试自动创建实际页面?如果您的所有产品页面都是相似的,那么“所有”您需要的是定义一个产品页面模板,并使用基于类的视图,使get方法使用模板和产品模型中的数据呈现产品页面。本教程:也介绍了向模型中添加产品slug所需的操作-Django有一个定义的“SlugField”用于此目的。我不知道这在Django中是可能的。感谢您的资源和评论!请发布更多详细信息和您当前使用的示例代码。为什么要尝试自动创建实际页面?如果您的所有产品页面都是相似的,那么“所有”您需要的是定义一个产品页面模板,并使用基于类的视图,使get方法使用模板和产品模型中的数据呈现产品页面。本教程:也介绍了向模型中添加产品slug所需的操作-Django有一个定义的“SlugField”用于此目的。我不知道这在Django中是可能的。感谢您的资源和评论!似乎在这里有一个页面对象是完全多余的——因为OP所要问的似乎都是基于产品信息呈现模板,并且他误解了Django呈现的工作原理。我可能错了,但我没有从这个问题中感觉到除了产品信息之外还有更多的数据。@Michael谢谢你的评论。你明白我想做什么。很抱歉,我无法添加大量数据,因为我自己无法理解代码的结构。-页面模型仅用于动态生成/删除页面?很高兴我能提供帮助。我的代码中的页面模型用于动态创建页面,但是,正如前面提到的其他人一样,您也可以使用产品模型在视图中呈现页面。两种方法都有效。如果你发现这个有用,请考虑投票和/或标记它作为答案。谢谢我想做的是--我创建一个包含我所有产品的db模型--每当管理员添加一条新记录时,就会用它自己的slug创建一个新页面,删除记录时也会使用类似的功能。(非常像您创建的示例url)什么样的信息可以帮助您更好地理解这一点?我真的要从这里开始了,请原谅我的错误。谢谢你,我所说的应该是这样的。如果愿意的话,您可以将Slug字段移动到页面模型中。这里似乎有一个页面对象是完全多余的,因为OP似乎只想根据产品信息呈现一个模板,而且他误解了Django呈现的工作原理。我可能错了,但我没有从这个问题中感觉到除了产品信息之外还有更多的数据。@Michael谢谢你的评论。你明白我想做什么。很抱歉,我无法添加大量数据,因为我自己无法理解代码的结构。-页面模型仅用于动态生成/删除页面?很高兴我能提供帮助。我的代码中的页面模型是用于动态创建页面的,但是,就像其他人提到的那样,您也可以只使用我们