django - Django 重复 url 请求:“home/home/”
问题描述
我的代码可以在 localhost 上完美运行,但是放在服务器上时会出错。
关键是,当我上传文件时,它返回“base.com/home/home”(home 两次 = 404),而不仅仅是“base.com/home”或重定向的目的地。
模板:
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="myfile">
<button type="submit">Upload</button>
</form>
看法:
def login_page(request):
if request.user.is_authenticated:
return redirect('base-home')
form = UserLoginForm(request.POST or None)
nextr = request.GET.get('next')
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = authenticate(username=username, password=password)
login(request, user)
if nextr:
return redirect(nextr)
return redirect('base-home')
return render(request, 'base/login.html', {'form': form})
@login_required
def home(request):
if request.method == 'POST':
return redirect('base-temp', 1)
return render(request, 'base/home.html', {'test': 'test'})
网址:
urlpatterns = [
path('', views.login_page, name='base-login'),
path('logout/', views.logout_page, name='base-logout'),
path('home/', views.home, name='base-home'),
path('temp/<int:pk>/', views.temp, name='base-temp')
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
项目设置:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
所有其他页面、媒体、静态都工作正常。仅此视图中的帖子。
我尝试使用带有"."
,"/home/"
和的操作"{% url 'base-home'%}"
,但它们都给出了相同的 404 来复制主页 url。
我还尝试创建一个单独的视图来处理上传,但是错误变成"home/upload"
了"upload"
.
我在 stackoverflow 中看到了一些类似的问题,但没有找到适合我的答案。
有什么建议吗?
编辑:
如果我将模板更改为:
<form method="post">
{% csrf_token %}
<textarea name="text"></textarea>
<button type="submit">Send</button>
</form>
并认为:
def home(request):
if request.method == 'POST':
return redirect('base-temp', 2)
return render(request, 'base/home.html', {'test': 'test'})
我没有使用 django 的 forms.py。
而已。没有其他的。只有基本温度的导入和简单的函数视图/模板。
编辑 2:添加了有关视图的更多详细信息。
解决方案:
如果其他人有同样的问题,我会根据 Maxwell O. Oyaro 的回答将解决方案留在这里。
我将主路由更改为应用程序 urls.py 的空路径:
urlpatterns = [
path('', views.home, name='base-home'),
path('logout/', views.logout_page, name='base-logout'),
path('temp/<int:pk>/', views.temp, name='base-temp')
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
然后,我将登录路径移至项目 urls.py:
...
from base import views as base_views
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', base_views.login_page, name='login'),
path('', include('base.urls'))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
解决方案
检查您的家是为 django 项目全局定义的,还是为应用程序本身定义的。
为项目和单独的应用程序全局放置模板可能会令人困惑。如果您有一个带有 home 的项目的模板,并且在名为 home 的应用程序中有另一个 home 模板,它可能无法满足您的期望。
只要仔细检查。
推荐阅读
- javascript - 是否有任何选项可以从对象数组中单独获取键值并将其作为单引号内的单独对象数组
- javascript - 使用 JSON.parse 和 JSON.stringify 的 Javascript 深拷贝
- java - 使用 ODFDOM Java API 编写 ODF 电子表格文档
- python - 如何根据条件从序列化程序中添加或删除字段?
- markdown - mkdocs 搜索栏在构建站点后不起作用
- react-native - 当我尝试使注册验证表单做出本机反应时,未定义不是对象(评估'event.target name')
- apache-nifi - Nifi IMAP消耗处理器引发错误
- nuxt.js - Apple Silicon 未能启动项目 Nuxtjs 项目
- javascript - 动态 React 元素创建的问题
- powerbi - 过滤时间线外的次要日期