我正在从项目教程中学习django,但遇到了问题。 问题是:
Internal Server Error: /account/
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 828, in _resolve_lookup
current = current[bit]
TypeError: 'ImageFieldFile' object is not subscriptable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "C:\Users\user\Desktop\crm1\accounts\decorators.py", line 23, in wrapper_func
return view_func(request, *args, **kwargs)
File "C:\Users\user\Desktop\crm1\accounts\views.py", line 107, in accountSettings
return render(request, 'accounts/accounts_settings.html', context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-packages\django\shortcuts.py",
line 19, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\loader.py", line 62, in render_to_string
return template.render(context, request)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\backends\django.py", line 61, in render
return self.template.render(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 171, in render
return self._render(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 163, in _render
return self.nodelist.render(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 936, in render
bit = node.render_annotated(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 903, in render_annotated
return self.render(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\loader_tags.py", line 150, in render
return compiled_parent._render(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 163, in _render
return self.nodelist.render(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 936, in render
bit = node.render_annotated(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 903, in render_annotated
return self.render(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\loader_tags.py", line 62, in render
result = block.nodelist.render(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 936, in render
bit = node.render_annotated(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 903, in render_annotated
return self.render(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 986, in render
output = self.filter_expression.resolve(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 670, in resolve
obj = self.var.resolve(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 795, in resolve
value = self._resolve_lookup(context)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\template\base.py", line 836, in _resolve_lookup
current = getattr(current, bit)
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\db\models\fields\files.py", line 61, in url
self._require_file()
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\site-
packages\django\db\models\fields\files.py", line 38, in _require_file
raise ValueError("The '%s' attribute has no file associated with it." % self.field.name)
ValueError: The 'profile_pic' attribute has no file associated with it.
[29/Jul/2020 21:48:43] "GET /account/ HTTP/1.1" 500 171347
这是views.py:
from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.forms import inlineformset_factory
from django.contrib.auth.forms import UserCreationForm
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import Group
from .models import *
from .forms import OrderForm, CreateUserForm, CustomerForm
from .filters import OrderFilter
from .decorators import unauthenticated_user, allowed_users, admin_only
# Create your views here.
@csrf_exempt
@unauthenticated_user
def registerPage(request):
form = CreateUserForm()
if request.method == 'POST':
form = CreateUserForm(request.POST)
if form.is_valid():
user = form.save()
username = form.cleaned_data.get('username') # to get the username data
group = Group.objects.get(name='customer')
user.groups.add(group)
Customer.objects.create(
user=user,
name=user.username,)
messages.success(request, 'Account was created for ' + username)
return redirect('accounts:login')
context = {'form':form}
return render(request, 'accounts/register.html', context)
@csrf_exempt
@unauthenticated_user # decorators.py
def loginPage(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('accounts:home')
else:
messages.info(request, 'Username OR password is incorrect')
context = {}
return render(request, 'accounts/login.html', context)
def logoutUser(request):
logout(request)
return redirect('accounts:login')
@login_required(login_url='accounts:login') # cant go to home page without logging in #important
@admin_only
def home(request):
orders = Order.objects.all()
customers = Customer.objects.all()
total_customers = customers.count()
total_orders = orders.count() # or Order.objects.all()
delivered = orders.filter(status='Delivered').count()
pending = orders.filter(status='Pending').count()
context = {'orders':orders, 'customers':customers, 'total_customers':total_customers, 'total_orders':total_orders, 'delivered':delivered, 'pending':pending}
return render(request, 'accounts/dashboard.html', context)
@login_required(login_url='accounts:login')
@allowed_users(allowed_roles=['customer'])
def userPage(request):
orders = request.user.customer.order_set.all()
total_orders = orders.count() # or Order.objects.all()
delivered = orders.filter(status='Delivered').count()
pending = orders.filter(status='Pending').count()
print('ORDERS:', orders)
context = {'orders':orders, 'total_orders':total_orders, 'delivered':delivered, 'pending':pending}
return render(request, 'accounts/user.html', context)
@login_required(login_url='login')
@allowed_users(allowed_roles=['customer'])
def accountSettings(request):
user = request.user
form = CustomerForm(instance=user)s
context = {'form':form}
return render(request, 'accounts/accounts_settings.html', context)
@login_required(login_url='accounts:login')
@allowed_users(allowed_roles=['admin']) # which users to allowed in home page (admin path)
def products(request):
products = Product.objects.all()
return render(request, 'accounts/products.html', {'products':products})
@login_required(login_url='accounts:login')
@allowed_users(allowed_roles=['admin'])
def customer(request, pk_test):
customer = Customer.objects.get(id=pk_test)
orders = customer.order_set.all()
order_count = orders.count()
myFilter = OrderFilter(request.GET, queryset=orders)
orders = myFilter.qs
context = {'customer':customer, 'orders':orders, 'order_count':order_count, 'myFilter':myFilter}
return render(request, 'accounts/customer.html', context)
@login_required(login_url='accounts:login')
@allowed_users(allowed_roles=['admin'])
def createOrder(request, pk):
OrderFormSet = inlineformset_factory(Customer, Order, fields=('product', 'status'), extra=10)
customer = Customer.objects.get(id=pk)
formset = OrderFormSet(queryset=Order.objects.none(),instance=customer)
#form = OrderForm(initial={'customer':customer})
if request.method == 'POST':
#print('Printing POST:', request.POST)
#form = OrderForm(request.POST)
formset = OrderFormSet(request.POST, instance=customer)
if formset.is_valid():
formset.save()
return redirect('/')
context = {'formset':formset}
return render(request, 'accounts/order_form.html', context)
@login_required(login_url='accounts:login')
@allowed_users(allowed_roles=['admin'])
def updateOrder(request, pk):
order = Order.objects.get(id=pk)
form = OrderForm(instance=order)
if request.method == 'POST':
form = OrderForm(request.POST, instance=order)
if form.is_valid():
form.save()
return redirect('/')
context = {'form':form}
return render(request, 'accounts/order_form.html', context)
@login_required(login_url='accounts:login')
@allowed_users(allowed_roles=['admin'])
def deleteOrder(request, pk):
order = Order.objects.get(id=pk)
if request.method == 'POST':
order.delete()
return redirect('/')
context = {'item':order}
return render(request, 'accounts/delete.html', context)
这是models.py:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Customer(models.Model):
user = models.OneToOneField(User, null=True, on_delete=models.CASCADE) # one to one relationship/ user-customer/ on_delete = when a user is delete, the customer is deleted too.
name = models.CharField(max_length=200, null=True)
phone = models.CharField(max_length=200, null=True)
email = models.CharField(max_length=200, null=True)
profile_pic = models.ImageField(null=True, blank=True)
data_created = models.DateTimeField(auto_now_add=True, null=True)
def __str__(slef):
return slef.name
class Tag(models.Model):
name = models.CharField(max_length=200, null=True)
def __str__(slef):
return slef.name
class Product(models.Model):
CATEGORY = (
('Indoor', 'Indoor'),
('Out Door', 'Out Door'),
)
name = models.CharField(max_length=200, null=True)
price = models.FloatField(null=True)
category = models.CharField(max_length=200, null=True, choices=CATEGORY)
description = models.CharField(max_length=200, null=True, blank=True)
date_created = models.DateTimeField(auto_now_add=True, null=True)
tags = models.ManyToManyField(Tag)
def __str__(slef):
return slef.name
@property
def image_url(self):
if self.image and hasattr(self.image, 'url'):
return self.image.url
class Order(models.Model):
STATUS = (
('Pending', 'Pending'),
('Out of delivery', 'Out of delivery'),
('Delivered', 'Delivered'),
)
customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL) # Database Relationships | One To Many & Many to Many
product = models.ForeignKey(Product, null=True, on_delete=models.SET_NULL) # Database Relationships | One To Many & Many to Many
date_created = models.DateTimeField(auto_now_add=True, null=True)
status = models.CharField(max_length=200, null=True, choices=STATUS)
note = models.CharField(max_length=1000, null=True)
def __str__(slef):
return slef.product.name
这是account_settings.html:
{% extends 'accounts/main.html' %}
{% load static %}
{% block content %}
<style>
.profile-pic{
max-width: 200px;
max-height:200px;
margin: 0 auto;
border-radius: 50%;
}
</style>
<br>
<div class="row">
<div class="col-md-3">
<div class="card card-body">
<a class="btn btn-warning" href="{% url 'accounts:home' %}"> ← Back to Profile</a>
<hr>
<h3 style="text-align: center">Account Settings</h3>
<hr>
<img class="profile-pic" src="{{request.user.customer.profile_pic.url}}" >
</div>
</div>
<div class="col-md-9">
<div class="card card-body">
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
{{form.as_p}}
<input class="btn btn-primary" type="submit" name="Update Information">
</form>
</div>
</div>
</div>
{% endblock %}
我认为问题出在account_settings.html模板中。
在这一行:<img class="profile-pic" src="{{request.user.customer.profile_pic.url}}" >
当我删除“ .url”时,显示模板,但没有个人资料图片。