【问题标题】:Django URL not rendering templatesDjango URL 不呈现模板
【发布时间】:2021-09-05 07:59:32
【问题描述】:

django 没有将我引导到页面,而是简单地返回以下错误:

“C:\Users\RodrigoPinto\Desktop\Insider\users\register”不存在

这是我的网址;

from django.urls import path
from users import employee_views
from users import views as auth_views
from django.contrib.auth.views import LoginView, LogoutView

app_name = 'users'

urlpatterns = [
    path('login/', LoginView.as_view(template_name='users/login.html')),
    path('logout/', LogoutView.as_view(template_name='users/logout.html'), name='logout'),
    path('register/', auth_views.Register.as_view, name='register'),
    path('profile/', auth_views.Profile.as_view, name='profile'),
    path('listView/', employee_views.AccountsListView.as_view, name='listView'),
    path('update/<pk>/', employee_views.AccountsUpdate.as_view, name='updateView'),
    path('password_update/<pk>/', employee_views.update_password, name='password_update'),
    path('delete/<pk>/', employee_views.AccountsDelete.as_view, name='deleteView'),
]

在主应用程序的 URL 中有这个;

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from users import urls as user_urls

app_name = "inside"

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('inside.urls')),
    path('users/', include(user_urls)),
]


if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

过去两个小时我一直在研究这段代码,但我无法理解我做错了什么。也许有人能看到我遗漏的东西。

我在设置中的模板目录也是这样配置的;

template_dir = [
    os.path.join(BASE_DIR, 'users', 'templates'),
    os.path.join(BASE_DIR, 'forums', 'templates'),
]


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': template_dir,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

views.py;

from django.urls import reverse_lazy
from .forms import UserCreateForm
from django.views.generic import CreateView, TemplateView
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.mixins import LoginRequiredMixin


class Register(SuccessMessageMixin, CreateView):
    form_class = UserCreateForm
    success_url = reverse_lazy('users:login')
    template_name = 'users/register.html'
    success_message = 'Your Account has been created!'


class Profile(LoginRequiredMixin, TemplateView):
    template_name = 'users/profile.html'

单独的文件以保持代码更清晰employee_views.py;

from django.views.generic import TemplateView, ListView, UpdateView, DeleteView
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.messages import error, success
from django.shortcuts import redirect, reverse
from django.urls import reverse_lazy
from django.shortcuts import render
from .models import User


@login_required()
def update_password(request, pk):
    if request.method == "POST":
        form_data = request.POST
        if form_data['password1'] == form_data['password2'] and len(form_data['password1']) > 7:
            u = User.objects.get(pk=pk)
            u.set_password(form_data['password1'])
            success(request, "Your Password has been updated!")
            u.save()
            return redirect(reverse('users:listView'))
        else:
            error(request, "Please check your passwords!")
            return render(request, "users/users/change_password.html", context={'pk': pk})

    return render(request, "users/users/change_password.html", context={'pk': pk})


class Profile(LoginRequiredMixin, TemplateView):
    template_name = 'users/profile.html'


class AccountsListView(LoginRequiredMixin, ListView):
    model = User
    paginate_by = 15
    template_name = "users/profile.html"


class AccountsUpdate(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
    model = User
    fields = ('username',
              'first_name',
              'last_name',
              'email',
              'image',
              'is_admin',
              'is_supervisor',
              )
    template_name = 'user_update_form.html'
    success_url = reverse_lazy('users:listView')


class AccountsDelete(LoginRequiredMixin, DeleteView):
    model = User
    success_url = reverse_lazy('users:listView')
    template_name = 'users/user_confirm_delete.html'

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    在这个陈述中问题是 99% 确定的:

    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
    

    我猜在你的 settings.py 中你有类似的东西

    MEDIA_URL = '/users/register/'
    MEDIA_ROOT = 'C:/....../register'
    

    您访问“127.0.0.1:8000/users/register/ 并且 static(...) 捕获请求并准确生成您收到的错误消息。

    这也是您没有得到通常详细的 Django 错误跟踪的原因。

    【讨论】:

      【解决方案2】:

      如果您使用基于通用类的视图,则需要具有这样的结构

      app_name
      |
      |--templates
          | 
          | -- app_name
                  |
                  |--register.html
      

      如果登录 url 发生错误,则在 register.html 的指定模板中查找。

      【讨论】:

      • Insider 只是项目名称,里面是应用程序,它只是呈现索引页面,未来还会有一些其他的东西。
      • 请看我的编辑。如果项目名称是 Insider,则不需要在 URL 中引用该名称,除非您在某处专门对该路径进行了硬编码
      • 哦,我明白你的困惑是什么,我没有在浏览器中使用文件路径作为 url,我使用 '127.0.0.1:8000/inside/users/login' 本地文件路径是 django 错误。
      • 我发的太早了。我确定了我的答案。您还可以在问题中显示完整的回溯吗?模板和视图也可能有所帮助。
      • 没有回溯。只是那个错误,出于某种原因,我无法理解 django 不打算渲染模板,它将更新问题以在几秒钟内包含我的观点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2019-08-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多