首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种方法可以在Django中创建记录时自动创建页面(和段)

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

Stack Overflow用户
提问于 2020-06-26 05:54:10
回答 1查看 34关注 0票数 1

我试图做一个Django网站,其中有所有的产品与他们的所有细节(每个产品都有自己的页面)。但是,由于产品太多且不断变化,我想根据数据库模型(models.py)自动创建和删除页面。我应该使用基于类的视图吗?我是不是应该使用一个带循环的基于函数的视图?

代码语言:javascript
运行
复制
# 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  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-26 06:09:19

如果我理解您要做的事情(自动创建产品页面),您可以覆盖Products模型中的save方法,以便在每次添加产品时创建一个新页面,然后在外键中使用models.CASCADE,以便在删除产品时删除相关页面,如下所示:

代码语言:javascript
运行
复制
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文件中一样:

代码语言:javascript
运行
复制
@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中,要获取一个页面:

代码语言:javascript
运行
复制
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中:

代码语言:javascript
运行
复制
...
path('/products/pages/<int:product_id>/<str:product_slug>/', product_page, name="product_page")
...

因此,url将如下所示:

代码语言:javascript
运行
复制
http://example.com/products/pages/3/my-amazing-widget/

如果您在模板中动态创建了链接,如下所示:

代码语言:javascript
运行
复制
{% for product in products %}
    <p><a href='{% url 'product_page' product.id product.slug %}'>{{ product.name }}</a></p>
{% endfor %}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62584905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档