【问题标题】:RelatedObjectDoesNotExist at / CustomUser has no customerRelatedObjectDoesNotExist at / CustomUser 没有客户
【发布时间】:2020-12-08 11:08:08
【问题描述】:

Hlw,我正在开发一个 Djang0 2.2.15 项目,我使用 allauth 设置我的用户帐户,我使用了一个名为 def cartData(request): in utils.py 的函数,我在 views.py 函数中调用了该函数,

    def cartData(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:
          cookieData = cookieCart(request)
          cartItems = cookieData['cartItems']
          order = cookieData['order']
          items = cookieData['items']

      return {'cartItems':cartItems ,'order':order, 'items':items}

在models.py中,我与用户使用onetoone关系的类是,

from django.db import models
from django.conf import settings
from django.urls import reverse
from django.contrib.auth import get_user_model

class Customer(models.Model):
     user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, 
     blank=True, on_delete=models.CASCADE)
     name = models.CharField(max_length=200, null=True)
     email = models.CharField(max_length=200)
 
     def __str__(self):
         return self.name

但是每当我运行我的项目时,我都会在控制台上发现这个错误,

users.models.CustomUser.customer.RelatedObjectDoesNotExist: CustomUser 
has no customer.

浏览器中的错误信息截图如下,

Browser error message Browser error message

我从中创建用户的forms.py,代码如下

class CustomUserCreationForm(UserCreationForm):

    class Meta:
        model = get_user_model()
        fields = ('email', 'username',)

类 CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = get_user_model()
        fields = ('email', 'username',)

users/views.py的代码如下,

from django.views import generic

from .forms import CustomUserCreationForm

class SignupPageView(generic.CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'signup.html'

【问题讨论】:

  • 很明显,当您创建 User 对象时,并未创建 Customer 实例。更好地检查您的信号/表单(您通过它创建了客户实例)
  • 我更新了我的问题并添加了一个表单,py 代码,我从中创建了一个用户,你能建议我创建一个客户实例吗

标签: django django-models django-forms django-views django-allauth


【解决方案1】:

好吧,CustomUserCreationForm 的代码应该只创建 User 实例,它不会创建任何 Customer 实例。因此,您可以更改表单代码来创建 Customer 对象。像这样:

#create_form
class CustomUserCreationForm(UserCreationForm):

    class Meta:
        model = get_user_model()
        fields = ('email', 'username',)

    def save(self, commit=False):
        user = super().save(commit=True)
        # Creating the customer object
        Customer.objects.create(user=user, name=self.cleaned_data['name'], email=self.cleaned_data['email'])
        return user

# update form
class CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = get_user_model()
        fields = ('email', 'username',)

    def save(self, commit=False):
          user = super().save(commit=True)
          Customer.objects.update_or_create(user=user, name=self.cleaned_data['name'], email=self.cleaned_data['email'], defaults={'user':user})
          return user

仅供参考,您不需要存储 emailname 信息,因为它已经存储在 User 模型中。如果您需要访问它们,请使用 user.customer.nameuser.customer.email

【讨论】:

  • 如果我使用 user.customer.name 或 user.customer.email 则显示用户未定义
  • 请查看更新后的答案。但对于老用户,您需要使用 CustomUpdateUser 表单更新这些用户
  • 我再次收到同样的错误,我应该删除所有用户然后添加,实际上我是初学者所以如何使用 CustomUpdateUser 进行更新
  • 如果您可以删除用户,那当然可以。但是,如果您对新创建的用户有问题,那么最好与视图共享您的代码
  • 我尝试了你提到的所有方法,但发生了同样的错误,你能告诉我你想要哪些代码,我的views.py代码在问题下方给出
猜你喜欢
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2020-05-20
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多