python - 在 url.py 中包含关键字在没有 app_name 的情况下不起作用(Django 2.0)

标签 python django

当我尝试在 url.py 中使用 include 关键字来反向匹配 model.py 中的 url reverse("products:detail", kwargs={"slug": self.slug} 它说:

在 include() 中指定命名空间而不提供 app_name ' django.core.exceptions.ImproperlyConfigured:不支持在 include() 中指定命名空间而不提供 app_name 。在包含的模块中设置 app_name 属性,或传递包含模式列表和 app_name 的二元组。

我发现在 Django 2.0 中,您必须为 app_name 提供命名空间。由于我使用 python manage.py startapp products 创建了我的应用程序,因此我认为我的应用程序名称是 products。我的网址.py:

from django.conf.urls import url, include
from django.contrib import admin

from django.conf import settings
from django.conf.urls.static import static

from .views import hello_world, home_page, about_page, contact_page, login_page, register_page

urlpatterns = [
    url(r'^hello/$', hello_world),

    url(r'^$', home_page),
    url(r'^admin/', admin.site.urls),
    url(r'^about/$', about_page),
    url(r'^contact/$', contact_page),
    url(r'^login/$', login_page),
    url(r'^register/$', register_page),

    url(r'^products/', include(products, namespace='products')),
]
if settings.DEBUG:
    urlpatterns = urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)`

还有我的产品/model.py:

import random
import os
from django.db import models
from django.db.models.signals import pre_save, post_save
from django.urls import reverse

from .utils import unique_slug_generator

def get_filename_ext(filepath):
    base_name = os.path.basename(filepath)
    name, ext = os.path.splitext(filepath)
    return name, ext

def upload_image_path(instance, filename):
    new_filename = random.randint(0, 3000)
    name, ext = get_filename_ext(filename)
    final_filename = f'{new_filename}{ext}'#.format(new_filename=new_filename, ext=ext)
    print(new_filename, final_filename, ext)
    return f"products/{new_filename}/{final_filename}"

class ProductQuerySet(models.query.QuerySet):
    def featured(self):
        return self.filter(featured=True)

    def active(self):
        return self.filter(active=True)

class ProductManager(models.Manager):
    def get_queryset(self):
        return ProductQuerySet(self.model, using=self._db)

    def all(self):
        return self.get_queryset().filter(active=True)

    def features(self):
        return self.get_queryset().filter(featured=True)

    def get_by_id(self, id):
        qs = self.get_queryset().filter(id=id)
        if qs.count()==1:
            return qs.first()
        return None

class Product(models.Model):    #Product_category
    title                 = models.CharField(max_length=120)
    slug                  = models.SlugField(blank=True, unique=True)
    description           = models.TextField()
    price                 = models.DecimalField(decimal_places = 2, max_digits = 10, default=39.99)
    image                 = models.ImageField(upload_to=upload_image_path, null=True, blank=True)
    featured              = models.BooleanField(default=False)
    active                = models.BooleanField(default=True)

    objects = ProductManager()

    def get_absolute_url(self):
        # return "/products/{slug}".format(slug=self.slug)
        return reverse("products:detail", kwargs={"slug": self.slug})

    def __str__(self):
        return self.title

def product_pre_save_receiver(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = unique_slug_generator(instance)

pre_save.connect(product_pre_save_receiver, sender=Product)

` 还有我的目录树

├── db.sqlite3
├── maalamaal
│   ├── forms.py
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── manage.py
├── products
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── __init__.py
│   │   └── __pycache__
│   ├── models.py
│   ├── __pycache__
│   ├── templates
│   │   └── products
│   │       ├── detail.html
│   │       ├── featured-detail.html
│   │       ├── list.html
│   │       └── snippets
│   │           └── card.html
│   ├── tests.py
│   ├── urls.py
│   ├── utils.py
│   └── views.py
├── static_maalamaal
└── templates
    ├── auth
    │   ├── login.html
    │   └── register.html
    ├── base
    │   ├── css.html
    │   ├── js.html
    │   └── navbar.html
    ├── base.html
    ├── contact
    │   └── view.html
    └── home_page.html

最佳答案

看来,我必须制作一个 urlconf 和 app_name 的元组。

from django.apps import apps
products_name = apps.get_app_config('products').verbose_name

然后,

    url(r'^products/', include(('products.urls', products_name), namespace='products')),

关于python - 在 url.py 中包含关键字在没有 app_name 的情况下不起作用(Django 2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48125161/

相关文章:

python - 反转列表中行的顺序

python - 从 Django 连接到外部 Web 套接字 api

python - IO错误 : [Errno 2] No such file or directory: '0.txt'

python - Django - 如何获取输入列表,选择使用 javascript 动态创建的?

django - 在哪里修改第 3 方应用的管理 View 代码?

python - 使用 matplotlib 生成许多图形的最有效方法

python - Django 过滤器子类模型

python - Django 中的 Fabric。如何解决等待 SSH 完成的 View

python - Django - 在 View 中返回多个查询集

python - django rest 3.1.1 - 具有 "many"属性的一对多序列化器