You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无staff权限时Django-recurrence widget无法使用问题求助

Django-recurrence Widget 普通用户无响应问题解决

问题核心分析

超级用户能正常使用widget,普通用户点击无反应,大概率是普通用户无法访问admin相关静态资源导致JS加载失败。超级用户拥有staff权限,可正常访问/admin路径下的资源,但普通用户访问/admin/js/core.js这类admin静态文件会被权限拦截(返回403),进而导致widget依赖的JS无法加载,功能失效。

相关代码回顾

Forms.py

class RecurringAbsencesForm(forms.ModelForm):
    class Meta:
        model = RecurringAbsences
        fields = ['ID','Recurrences']
    def clean(self):
        cleaned_data = super().clean()
    
    class Media:
        js = ('/admin/jsi18n', '/admin/js/core.js',)

HTML模板

{% extends 'Base.html' %}
{% load bulma_tags %}
{% block title %}Create Recurring Absence{% endblock %}
{% load static %}
{% block content %}
<head>
    <script type="text/javascript" src="/admin/jsi18n"></script>
    <script type="text/javascript" src="/static/admin/js/core.js"></script>
    {{form.media}}
</head>


<div class="main container column is-3">
    <h1 class="title has-text-centered"> Create Recurring Absence </h1>
    <form method="POST" class="post-form">
        {% csrf_token %}
        <div class="container has-text-weight-bold">

            {% csrf_token %}
            {% if message %}
            {% include "messages.html" %}
            {% endif %}
            {{ form }}
            
            {{ form.media }}
            {% for error in form.errors %}
            {% endfor %}
            <div class="pt-6 pb-3">
                {{ form2 | bulma }}
            </div>
            
            <button id="submit" type="submit" class="button is-fullwidth is-link">Submit</button>
        </div>

    </form>
</div>

{% endblock %}

Urls.py配置

url(r'^jsi18n', JavaScriptCatalog.as_view(), js_info_dict),

具体解决方案

1. 替换admin静态资源引用

将依赖的admin JS文件复制到项目公共静态目录(比如static/js/),修改Forms.py的Media类,避免依赖admin权限,同时添加django-recurrence自带的资源:

# Forms.py 修改Media类
class Media:
    js = (
        '/jsi18n',  # 已配置公共访问的jsi18n路由
        '/static/js/core.js',  # 复制到公共静态目录后的路径
        '/static/recurrence/js/recurrence.js',  # django-recurrence自带的核心JS
    )
    css = {
        'all': ('/static/recurrence/css/recurrence.css',)  # 对应加载widget样式
    }

同时删除HTML模板中重复的form.media调用,确保只在合适位置加载一次:

{% block content %}
<head>
    {{ form.media }}  <!-- 只保留这一处即可,自动加载配置的JS和CSS -->
</head>
<!-- 其他内容不变 -->
{% endblock %}

2. 收集公共静态资源

运行以下命令,将django-recurrence和admin的静态文件收集到项目公共静态目录,确保普通用户能访问:

python manage.py collectstatic

3. 检查控制台错误定位问题

让普通用户访问页面时,打开浏览器开发者工具(F12)的控制台,查看是否有403/404错误(资源加载失败),这能直接确认是否是权限或路径问题。

4. 完善JavaScriptCatalog配置

确保js_info_dict包含django-recurrence的翻译包,避免国际化相关错误:

from django.views.i18n import JavaScriptCatalog

js_info_dict = {
    'packages': ('recurrence',),
}

urlpatterns = [
    url(r'^jsi18n', JavaScriptCatalog.as_view(), js_info_dict),
    # 其他路由
]

总结

核心问题在于普通用户无权限访问admin静态资源,通过迁移依赖资源到公共目录、正确配置django-recurrence的Media资源,即可解决widget无响应的问题。

内容的提问来源于stack exchange,提问作者Jai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:53:22