我有一个Django网页应用。我有一个产品应用和一个账户应用。当我在账户应用上注册一个新用户时,它成功地创建了一个用户,然后它被重定向到我的主页,在那里显示了一堆产品(由超级用户控制)。但是当我在 http:/127.0.0.1:8000login 使用新创建的用户,而不是管理员,当登录成功后,我应该被重定向到我的主页,但有一个错误,说。RelatedObjectDoes not exist at User has no customer. 我还是新手,谢谢!
from django.db import models
from django.contrib.auth.models import User
class Customer(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=100, null=True)
email = models.CharField(max_length=100, null=True)
from django.shortcuts import render, redirect
from .forms import RegisterForm
def register(response):
if response.method == "POST":
form = RegisterForm(response.POST)
if form.is_valid():
form.save()
return redirect('/')
else:
form = RegisterForm()
return render(response, "register/register.html", {'form':form})
def home(request):
if request.user.is_authenticated:
customer = request.user.customer
order, created = Order.objects.get_or_create(customer=customer, complete=False)
items = order.orderitem_set.all()
cartItems = order.get_cart_items
else:
items = []
order = {'get_cart_total':0, 'get_cart_items':0}
cartItems = order['get_cart_items']
#this gets all product objects in the database.
products = Product.objects.all()
#counts how many special offers we have by using count() function
special_offer = Product.objects.filter(special_offer=True).count()
#returns the average price of all the product objects that we have
aggr = Product.objects.aggregate(average_price=Avg('price'))
average_price = round(aggr['average_price'], 2)
#passes the product objects as a context to be passed to a template.
context = {'products' : products, 'special_offer' : special_offer, 'average_price' : average_price, 'cartItems' : cartItems}
return render(request, 'store.html', context)
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/
Django Version: 3.0.6
Python Version: 3.8.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TheApp',
'crispy_forms',
'register.apps.RegisterConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "\Python\Python38\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "\Python\Python38\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "\Python\Python38\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "\Desktop\django_projects\TheEcommerceProject\TheApp\views.py", line 13, in home
customer = request.user.customer
File "\Python\Python38\site-packages\django\utils\functional.py", line 225, in inner
return func(self._wrapped, *args)
File "\Python\Python38\site-packages\django\db\models\fields\related_descriptors.py", line 420, in __get__
raise self.RelatedObjectDoesNotExist(
Exception Type: RelatedObjectDoesNotExist at /
Exception Value: User has no customer.
你好,首先在客户模型中的onetoonefiled中添加related_name属性,和下面的代码一样。
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name = 'customer', null=True, blank=True)
进行迁移,迁移后再试