Django 3.0:没有找到没有参数的“产品”的反向。尝试了 1 种模式:['product/(?P<slug>[^/]+)/$']

Posted

技术标签:

【中文标题】Django 3.0:没有找到没有参数的“产品”的反向。尝试了 1 种模式:[\'product/(?P<slug>[^/]+)/$\']【英文标题】:Django 3.0: Reverse for 'product' with no arguments not found. 1 pattern(s) tried: ['product/(?P<slug>[^/]+)/$']Django 3.0:没有找到没有参数的“产品”的反向。尝试了 1 种模式:['product/(?P<slug>[^/]+)/$'] 【发布时间】:2020-08-24 18:40:09 【问题描述】:

我在 models.py 文件中有名为 Book 的模型。 而且这个模型有 slug 字段来显示书籍的详细信息 书籍显示在 home.html 模板中,product.html 模板显示所选书籍的详细信息。

我真的不太了解蛞蝓以及它们的工作原理。

Models.py:

class Book(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField('Title', max_length=255)
    authors = models.ManyToManyField(Author, related_name='books_written')
    publisher = models.ForeignKey(Publisher, on_delete=models.DO_NOTHING, related_name='books_published')
    price = models.DecimalField('Price', decimal_places=2, max_digits=10)
    description = models.TextField('Description')
    upload_timestamp = models.DateTimeField('Uploading DateTime', auto_now_add=True)
    categories = models.ManyToManyField(Category, related_name='book_category')
    cover = models.ImageField(upload_to='covers', null=True,blank=True)
    copyright_proof = models.ImageField(upload_to=book_copyrights_path, null=True,blank=True)
    slug = models.SlugField(max_length=100,blank=True)

    def get_absolute_url(self):
        return reverse("bookrepo:product", kwargs=
            'slug': self.slug
        )

    def __str__(self):
        return "Title:  | Authors:  | Price: ".format(
            self.title, self.get_authors(), self.price
        )

urls.py

app_name = 'bookrepo'

urlpatterns = [
    path('product/<slug:slug>/', ItemDetailView.as_view(), name='product'),     
    path('',views.home,name='home'),
    path('about/',views.about,name='about'),
    path('faq/',views.faq,name='faq'),
    path('login/',views.user_login,name='login'),
    path('shop/',views.shop,name='shop'),
    path('signup/',views.registration,name='signup'),
    path('logout/', views.user_logout, name='logout'),
]

views.py

class ItemDetailView(DetailView):
    model = Book
    template_name = "bookrepo/product.html"
    def main(self, *args, **kwargs):
        # kwargs key should be equal to parameter passed from url
        slug_from_param = self.kwargs.get('slug')

def home(request):
    bookz = Book.objects.order_by('title')
    var = 'books': bookz, 'range': 10
    return render(request, 'bookrepo/home.html', context=var)

home.html

<div class="row">
    % load my_filters %
        % for b in books|slice:":10" %
            <div class="col-lg-2 col-md-3 col-sm-4">
                <div class="item">
                    <img src=" b.cover.url " >
                    <h6> b.title </h6>
                    <h6> b.get_authors </h6>
                    <h6><span class="price"> b.price </span></h6>

                    <a href="% url 'bookrepo:product' b.slug %" class="btn btn-sm my-btn detail-btn">
                        <span><i class="fa fa-info-circle"></i></span>Book Details
                    </a>

                </div>
            </div>
        % endfor %
 </div>

老实说,我对 slug 和基于类的视图了解不多。我只使用了基于函数的视图。而且,通过搜索互联网,我发现了这种获取详细信息页面网址的“slug”方式。

在html模板中,我尝试了这种方式:(得到相同的结果)

<a href=" item.get_absolute_url " class="btn btn-sm my-btn detail-btn">

【问题讨论】:

【参考方案1】:

简单地做:

<a href="% url 'product' b.slug %" class="btn btn-sm my-btn detail-btn">

你的 urls.py,&lt;slug&gt;&lt;slug:slug&gt;

path('product/<slug:slug>/', ItemDetailView.as_view(), name='product'), 

在你的views.py中,你可以得到slug:

class ItemDetailView(DetailView):
    model = Book
    template_name = "bookrepo/product.html"
    def main(self, *args, **kwargs):
        # kwargs key should be equal to parameter passed from url
        slug_from_param = self.kwargs.get('slug')

        # Your remaining codes

Slug 只不过是一个网址。因为,你不能在 url 中添加任何字符串,因为可以有空格,你可以使用 slug. 看看Refs

【讨论】:

试过但结果相同。我收到此错误:未找到未找到参数的“产品”的反向。尝试了 1 种模式: ['product/(?P[^/]+)/$'] ,只要我运行 server.所以问题可能在views.py或urls.py中。 是的,我也试过了。但它不是同样的错误。我认为它来自家庭视图。请检查一下。 到目前为止你做了什么......再次更新你的问题......我在我的答案中编辑了很多,我认为它现在应该可以工作了 我是否必须根据我的代码更改您上次编辑的内容,还是应该按原样尝试? 用你正在尝试的最新的东西来编辑你的问题,但是没有用... 最新的

以上是关于Django 3.0:没有找到没有参数的“产品”的反向。尝试了 1 种模式:['product/(?P<slug>[^/]+)/$']的主要内容,如果未能解决你的问题,请参考以下文章

Django中的“没有找到参数的'页面'的反向。尝试了1个模式”

Django .Reverse 用于“医生”,没有找到任何参数。尝试了 1 种模式:['doctor / (?P <pk> [^ /] +) / $']

在 django 3.0 中将复选框选项显示为“已禁用”。模型形式

如何在 Django 的 URL 匹配中获取中文参数

如何使用测试客户端测试 django (3.0) CreateView 的“form_valid”方法和参数?

django 3.0 异步 orm