无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
相关产品推荐
相关产品推荐

