当我将可选参数传递给视图时,为啥我的 CSS 静态文件在 Django 中不起作用?

Posted

技术标签:

【中文标题】当我将可选参数传递给视图时,为啥我的 CSS 静态文件在 Django 中不起作用?【英文标题】:Why don't my CSS static files work in Django when I pass an optional parameter to the view?当我将可选参数传递给视图时,为什么我的 CSS 静态文件在 Django 中不起作用? 【发布时间】:2021-05-30 03:52:08 【问题描述】:

我正在 Django 中创建一个应用程序,其中我有一个主(索引)页面,其中显示了许多使用 CSS 样式设置的对象。 CSS 位于静态文件中。当我不向views.py 中的索引视图传递任何参数时,所有的CSS 都呈现得很好。但是,每当我向视图 url 传递一个额外的参数时,都不会应用 CSS(但信息会正确显示)。请问有人可以帮我解决这个问题吗?

settings.py:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "auctions/static")
STATICFILES_DIRS = [os.path.join(BASE_DIR, "auctions/static")]

urls.py(应用程序):

urlpatterns = [
    path("categories", views.categories, name="categories"),
    path("", views.index, name="index"),
    **path("category/<str:cat_name>", views.index, name="index"),**
    path("create_listing", views.create_listing, name="create"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("<int:id>", views.view_listing, name="view"),
    path("watchlist", views.watchlist, name="watchlist")
]+static(settings.STATIC_URL, document_root=settings.STATIC_ROOT

模板:

% load static %
<link href="% static 'auctions/styles.css' %" rel="stylesheet">

views.py:

def index(request, cat_name=None):
    if cat_name is not None:
        listings = Listing.objects.filter(category=cat_name)
        listings = listings.filter(bid_active=True)
    else:
        listings = Listing.objects.filter(bid_active=True)
    return render(request, "auctions/index.html", 
            "listings": listings
            )

基本上,如果我不输入额外参数,视图就会起作用(但我必须这样做以避免代码中的冗余)。

【问题讨论】:

我没有看到您的网址以斜杠结尾(例如"categories" 应该是"categories/"),您的网址是否有效,或者您是否在设置中设置了APPEND_SLASH = False?跨度> 【参考方案1】:

在您的 url 模式中,它们都被命名为“index”。将其中之一命名为“index_with_category”。但这并不能解决您的问题。为此,请查看浏览器中的源代码并查看 css 指向的位置。

当您指定一个类别时,您的 url 模式匹配 category 路径,它在 /static_root/category/auctions/styles.css 中寻找您的 styles.css,但您希望它指向 /static_root/auctions/styles.css。由于您的网址中有category,并且您的css文件的href中没有前导斜杠,因此浏览器正在寻找相对于categoryauctions,在某些情况下您可能想要,但可能不是在这个。当您不传递类别时,您的 url 已经位于您网站的根目录,因此对 auctions 目录的相对引用有效。

我怀疑您想将该行更改为具有前导斜线,否则它将查找与类别相关的拍卖:

<link href="% static '/auctions/styles.css' %" rel="stylesheet">

【讨论】:

以上是关于当我将可选参数传递给视图时,为啥我的 CSS 静态文件在 Django 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

是否有必要在将可选参数传递给另一个可选参数之前检查它?

如何将可选参数传递给 C++ 中的方法?

将可选路径参数传递给 ant

将可选参数传递给 ASP.NET API 的 GET 方法

如何将可选参数传递给typescript中的回调函数

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?