Image 1- Error
I notice Exception Value: registration/login.html
, I don’t even have that in the templates, instead, i have sign-in.html, I have no idea why it mentioned login.html. Please see my templates folder below as image 3-Templates.
- I’m trying to fix the above error. My project path looks like
Image 2- project path
Image 3- Templates
- The image 2 above shows that my templates folder is located in foodtaskerapp folder
- In the settings.py I have added
'DIRS': [os.path.join(BASE_DIR, 'templates')],
in the TEMPLATES section. - I think there is an error because before we can get to templates from BASE_DIR we need to pass through the foodtaskerapp. This leads me to the following step
- In the settings.py I tried
'DIRS': [os.path.join(BASE_DIR, 'foodtaskerapp','templates')],
to replace step 2 - After the above step, I also tried
'DIRS': [os.path.join(BASE_DIR, 'foodtaskerapp\templates')],
. I had use two slashes here because when i used the print command from the interactive console i saw the path was given in that format. - I have also tried move my templates folder from the foodtaskerapp to the root folder and I checked like below to confirm if I’m in the right path:
from django.conf import settings
print(settings.TEMPLATES)
Then I got
'DIRS': ['C:\Users\simple_tech\Desktop\foodtasker-master\foodtasker-master\templates']
The above shows I’m on the right path.
But I still got the error “TemplatesDoesNotExist” whenever I clicked on the server URL after running
python manage.py runserver
For further investigation, bellow is my
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)
Please help!
Thanks for your time.
Advertisement
Answer
Django does not have a “default” login.html
template .
see more here
the login view uses the registration/login.html
template
just like ny other app in your project, third apps or in this case, a contrib (builtin) app.. you need to crate templates inside a known path.
In this case path = registration/login.html
All you have todo is, create in your templates root dir, another dir with name registration
and the, inside it, a template file called login.html