首页 > 解决方案 > 即使在 BASE_DIR 与 settings.py 中的模板连接后,如何修复 TemplatesDoesNotExist 错误?

问题描述

图 1- 错误

notice Exception Value: registration/login.html ,我什至没有在模板中,相反,我有 sign-in.html,我不知道为什么它提到 login.html。请在下面查看我的模板文件夹作为图像 3-模板。

在此处输入图像描述

  1. 我正在尝试修复上述错误。我的项目路径看起来像

图 2- 项目路径

在此处输入图像描述

图 3- 模板

在此处输入图像描述

  1. 上图 2 显示我的模板文件夹位于 foodtaskerapp 文件夹中
  2. 在 settings.py 中,我已'DIRS': [os.path.join(BASE_DIR, 'templates')],在 TEMPLATES 部分添加。
  3. 我认为有一个错误,因为在我们可以从 BASE_DIR 获取模板之前,我们需要通过 foodtaskerapp。这导致我进入以下步骤
  4. 在 settings.py 我尝试'DIRS': [os.path.join(BASE_DIR, 'foodtaskerapp','templates')],替换第 2 步
  5. 完成上述步骤后,我也尝试了'DIRS': [os.path.join(BASE_DIR, 'foodtaskerapp\\templates')],. 我在这里使用了两个斜杠,因为当我使用交互式控制台中的打印命令时,我看到路径是以那种格式给出的。
  6. 我还尝试将我的模板文件夹从 foodtaskerapp 移动到根文件夹,然后我检查如下以确认我是否在正确的路径中:
from django.conf import settings

print(settings.TEMPLATES)

然后我得到了

'DIRS': ['C:\\Users\\simple_tech\\Desktop\\foodtasker-master\\foodtasker-master\\templates']

以上表明我走在正确的道路上。

但是每当我在运行后单击服务器 URL 时,我仍然收到错误“TemplatesDoesNotExist”

python manage.py runserver

为了进一步调查,下面是我的

URLS.PY

from django.conf.urls import url, include
        from django.contrib import admin
        from django.contrib.auth import views as auth_views
        from django.conf.urls.static import static
        from django.conf import settings
        from foodtaskerapp import views, apis
        
        urlpatterns = [
            url(r'^admin/', admin.site.urls),
            url(r'^$', views.home, name='home'),
            url(r'^restaurant/sign-in/$', auth_views.LoginView.as_view(), {'template_name': 'restaurant/sign_in.html'}, name = 'restaurant-sign-in'),
            url(r'^restaurant/sign-out', auth_views.LogoutView.as_view(), {'next_page': '/'}, name = 'restaurant-sign-out'),
            url(r'^restaurant/sign-up', views.restaurant_sign_up, name = 'restaurant-sign-up'),
            url(r'^restaurant/$', views.restaurant_home, name = 'restaurant-home'),
            url(r'^restaurant/account/$', views.restaurant_account, name = 'restaurant-account'),
            url(r'^restaurant/meal/$', views.restaurant_meal, name = 'restaurant-meal'),
            url(r'^restaurant/meal/add/$', views.restaurant_add_meal, name = 'restaurant-add-meal'),
            url(r'^restaurant/meal/edit/(?P<meal_id>\d+)/$', views.restaurant_edit_meal, name = 'restaurant-edit-meal'),
            url(r'^restaurant/order/$', views.restaurant_order, name = 'restaurant-order'),
            url(r'^restaurant/report/$', views.restaurant_report, name = 'restaurant-report'),
        
            # Sign In/ Sign Up/ Sign Out
            url(r'^api/social/', include('rest_framework_social_oauth2.urls')),
            # /convert-token (sign in/ sign up)
            # /revoke-token (sign out)
            url(r'^api/restaurant/order/notification/(?P<last_request_time>.+)/$', apis.restaurant_order_notification),
            # APIs for CUSTOMERS
            url(r'^api/customer/restaurants/$', apis.customer_get_restaurants),
            url(r'^api/customer/meals/(?P<restaurant_id>\d+)/$', apis.customer_get_meals),
            url(r'^api/customer/order/add/$', apis.customer_add_order),
            url(r'^api/customer/order/latest/$', apis.customer_get_latest_order),
            url(r'^api/customer/driver/location/$', apis.customer_driver_location),
        
            # APIs for DRIVERS
            url(r'^api/driver/orders/ready/$', apis.driver_get_ready_orders),
            url(r'^api/driver/order/pick/$', apis.driver_pick_order),
            url(r'^api/driver/order/latest/$', apis.driver_get_latest_order),
            url(r'^api/driver/order/complete/$', apis.driver_complete_order),
            url(r'^api/driver/revenue/$', apis.driver_get_revenue),
            url(r'^api/driver/location/update/$', apis.driver_update_location),
        
            ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
**views.py** 
    from django.shortcuts import render, redirect
    from django.contrib.auth.decorators import login_required
    from foodtaskerapp.forms import UserForm, RestaurantForm, UserFormForEdit, MealForm
    from django.contrib.auth import authenticate, login
    
    from django.contrib.auth.models import User
    from foodtaskerapp.models import Meal, Order, Driver
    
    from django.db.models import Sum, Count, Case, When
    
    
    def home(request):
        return redirect(restaurant_home)
    
    
    @login_required(login_url='/restaurant/sign-in/')
    def restaurant_home(request):
        return redirect(restaurant_order)
    
    
    @login_required(login_url='/restaurant/sign-in/')
    def restaurant_account(request):
        user_form = UserFormForEdit(instance=request.user)
        restaurant_form = RestaurantForm(instance=request.user.restaurant)
    
        if request.method == "POST":
            user_form = UserFormForEdit(request.POST, instance=request.user)
            restaurant_form = RestaurantForm(request.POST, request.FILES, instance=request.user.restaurant)
    
            if user_form.is_valid() and restaurant_form.is_valid():
                user_form.save()
                restaurant_form.save()
    
        return render(request, 'restaurant/account.html', {
            "user_form": user_form,
            "restaurant_form": restaurant_form
        })
    
    
    @login_required(login_url='/restaurant/sign-in/')
    def restaurant_meal(request):
        meals = Meal.objects.filter(restaurant=request.user.restaurant).order_by("-id")
        return render(request, 'restaurant/meal.html', {"meals": meals})
    
    
    @login_required(login_url='/restaurant/sign-in/')
    def restaurant_add_meal(request):
        form = MealForm()
    
        if request.method == "POST":
            form = MealForm(request.POST, request.FILES)
    
            if form.is_valid():
                meal = form.save(commit=False)
                meal.restaurant = request.user.restaurant
                meal.save()
                return redirect(restaurant_meal)
    
        return render(request, 'restaurant/add_meal.html', {
            "form": form
        })
    
    
    @login_required(login_url='/restaurant/sign-in/')
    def restaurant_edit_meal(request, meal_id):
        form = MealForm(instance=Meal.objects.get(id=meal_id))
    
        if request.method == "POST":
            form = MealForm(request.POST, request.FILES, instance=Meal.objects.get(id=meal_id))
    
            if form.is_valid():
                form.save()
                return redirect(restaurant_meal)
    
        return render(request, 'restaurant/edit_meal.html', {
            "form": form
        })
    
    
    @login_required(login_url='/restaurant/sign-in/')
    def restaurant_order(request):
        if request.method == "POST":
            order = Order.objects.get(id=request.POST["id"], restaurant=request.user.restaurant)
    
            if order.status == Order.COOKING:
                order.status = Order.READY
                order.save()
    
        orders = Order.objects.filter(restaurant=request.user.restaurant).order_by("-id")
        return render(request, 'restaurant/order.html', {"orders": orders})
    
    
    @login_required(login_url='/restaurant/sign-in/')
    def restaurant_report(request):
        # Calculate revenue and number of order by current week
        from datetime import datetime, timedelta
    
        revenue = []
        orders = []
    
        # Calculate weekdays
        today = datetime.now()
        current_weekdays = [today + timedelta(days=i) for i in range(0 - today.weekday(), 7 - today.weekday())]
    
        for day in current_weekdays:
            delivered_orders = Order.objects.filter(
                restaurant=request.user.restaurant,
                status=Order.DELIVERED,
                created_at__year=day.year,
                created_at__month=day.month,
                created_at__day=day.day
            )
            revenue.append(sum(order.total for order in delivered_orders))
            orders.append(delivered_orders.count())
    
        # Top 3 Meals
        top3_meals = Meal.objects.filter(restaurant=request.user.restaurant) \
                         .annotate(total_order=Sum('orderdetails__quantity')) \
                         .order_by("-total_order")[:3]
    
        meal = {
            "labels": [meal.name for meal in top3_meals],
            "data": [meal.total_order or 0 for meal in top3_meals]
        }
    
        # Top 3 Drivers
        top3_drivers = Driver.objects.annotate(
            total_order=Count(
                Case(
                    When(order__restaurant=request.user.restaurant, then=1)
                )
            )
        ).order_by("-total_order")[:3]
    
        driver = {
            "labels": [driver.user.get_full_name() for driver in top3_drivers],
            "data": [driver.total_order for driver in top3_drivers]
        }
    
        return render(request, 'restaurant/report.html', {
            "revenue": revenue,
            "orders": orders,
            "meal": meal,
            "driver": driver
        })
    
    
    def restaurant_sign_up(request):
        user_form = UserForm()
        restaurant_form = RestaurantForm()
    
        if request.method == "POST":
            user_form = UserForm(request.POST)
            restaurant_form = RestaurantForm(request.POST, request.FILES)
    
            if user_form.is_valid() and restaurant_form.is_valid():
                new_user = User.objects.create_user(**user_form.cleaned_data)
                new_restaurant = restaurant_form.save(commit=False)
                new_restaurant.user = new_user
                new_restaurant.save()
    
                login(request, authenticate(
                    username=user_form.cleaned_data["username"],
                    password=user_form.cleaned_data["password"]
                ))
    
                return redirect(restaurant_home)
    
        return render(request, "restaurant/sign_up.html", {
            "user_form": user_form,
            "restaurant_form": restaurant_form
        })
**model.py** 
    from django.db import models
    from django.contrib.auth.models import User
    from django.utils import timezone
    
    class Restaurant(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='restaurant')
        name = models.CharField(max_length=500)
        phone = models.CharField(max_length=500)
        address = models.CharField(max_length=500)
        logo = models.ImageField(upload_to='restaurant_logo/', blank=False)
    
        def __str__(self):
            return self.name
    
    class Customer(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='customer')
        avatar = models.CharField(max_length=500)
        phone = models.CharField(max_length=500, blank=True)
        address = models.CharField(max_length=500, blank=True)
    
        def __str__(self):
            return self.user.get_full_name()
    
    class Driver(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='driver')
        avatar = models.CharField(max_length=500)
        phone = models.CharField(max_length=500, blank=True)
        address = models.CharField(max_length=500, blank=True)
        location = models.CharField(max_length=500, blank=True)
    
        def __str__(self):
            return self.user.get_full_name()
    
    class Meal(models.Model):
        restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, related_name='meal')
        name = models.CharField(max_length=500)
        short_description = models.CharField(max_length=500)
        image = models.ImageField(upload_to='meal_images/', blank=False)
        price = models.IntegerField(default=0)
    
        def __str__(self):
            return self.name
    
    class Order(models.Model):
        COOKING = 1
        READY = 2
        ONTHEWAY = 3
        DELIVERED = 4
    
        STATUS_CHOICES = (
            (COOKING, "Cooking"),
            (READY, "Ready"),
            (ONTHEWAY, "On the way"),
            (DELIVERED, "Delivered"),
        )
    
        customer = models.ForeignKey(Customer, on_delete=models.DO_NOTHING)
        restaurant = models.ForeignKey(Restaurant, on_delete=models.DO_NOTHING)
        driver = models.ForeignKey(Driver, on_delete=models.DO_NOTHING, blank = True, null = True)
        address = models.CharField(max_length=500)
        total = models.IntegerField()
        status = models.IntegerField(choices = STATUS_CHOICES)
        created_at = models.DateTimeField(default = timezone.now)
        picked_at = models.DateTimeField(blank = True, null = True)
    
        def __str__(self):
            return str(self.id)
    
    class OrderDetails(models.Model):
        order = models.ForeignKey(Order, on_delete=models.DO_NOTHING, related_name='order_details')
        meal = models.ForeignKey(Meal, on_delete=models.DO_NOTHING)
        quantity = models.IntegerField()
        sub_total = models.IntegerField()
    
        def __str__(self):
            return str(self.id)

请帮忙!

谢谢你的时间。

标签: pythondjangodjango-modelsdjango-viewsdjango-templates

解决方案


Django 没有“默认” login.html模板。在这里查看更多

登录视图 使用该 模板registration/login.html,就像您项目中的任何其他应用程序、第三个应用程序或在本例中为一个 contrib(内置)应用程序一样。您需要在已知路径中创建模板。在这种情况下路径 =registration/login.html

您所要做的就是,在您的模板根目录中创建另一个具有名称registration的目录,并在其中创建一个名为的模板文件login.html


推荐阅读