【问题标题】:Cannot link an authenticated user to their new Account upon creation创建时无法将经过身份验证的用户链接到他们的新帐户
【发布时间】:2021-03-18 18:01:01
【问题描述】:

我希望每个用户都能够创建一个帐户(每个用户最多一个帐户)。 会话中的用户将无法看到创建帐户的选项,除非他们已登录/经过身份验证。 当我登录并单击 Create Account 表单上的提交时,会出现此错误:

'ValueError at /accounts/create/ 无法分配“>”:“Account.user”必须是“User”实例。'

我的models.py:

from django.db import models
from django.contrib import auth
from django.utils.text import slugify
from django.urls import reverse

from django import template
register = template.Library()

class User(auth.models.User,auth.models.PermissionsMixin):

def __str__(self):
    return self.username

class Account(models.Model):
user = models.OneToOneField(User,related_name='customer_account',on_delete=models.CASCADE)
first_name = models.CharField(max_length=30,blank=True)
surname = models.CharField(max_length=30,blank=True)
billing_address = models.TextField(blank=True)
delivery_address = models.TextField(blank=True)

def __str__(self):
    return f"Account: {self.user.username}"

def get_absolute_url(self):
    return reverse('about',kwargs={'username':self.user.username,
                                                            'pk':self.pk})

Views.py:

from django.shortcuts import render
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin
from braces.views import SelectRelatedMixin
from django.views.generic import (CreateView, UpdateView,
                                ListView, DetailView,
                                TemplateView,)
from . import forms
from . import models
from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import redirect
from django.contrib.auth import get_user_model
# User = get_user_model()


class SignUp(CreateView):
    form_class = forms.CreateCustomerForm
    success_url = reverse_lazy('login')
    template_name = 'accounts/signup.html'


class CreateAccount(LoginRequiredMixin,CreateView):
    model = models.Account
    fields = ['first_name','surname','billing_address','delivery_address']
    template_name = 'accounts/create_account.html'

    def form_valid(self,form):
            self.object = form.save(commit=False)
            self.object.user = self.request.user
            self.object.save()
            return super().form_valid(form)

Forms.py:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import get_user_model
from . import models

class CreateCustomerForm(UserCreationForm):
class Meta:
    model = get_user_model()
    fields = ('username','email','password1','password2')

def __init__(self,*args,**kwargs):
    super().__init__(*args,**kwargs)
    self.fields['username'].label = 'Username'
    self.fields['email'].label = "Email Address"

网址.py:

 from django.conf.urls import url
from accounts import views
from django.contrib.auth import views as auth_views

app_name = 'accounts'

urlpatterns = [
    url(r'^login/$',auth_views.LoginView.as_view(template_name='accounts/login.html'),name='login'),
    url(r'^logout/$',auth_views.LogoutView.as_view(),name='logout'),
    url(r'^signup/$',views.SignUp.as_view(),name='signup'),
    url(r'^create/$',views.CreateAccount.as_view(),name='create'),

]

根据 Traceback 部分,这里似乎出了问题:

    line 39, in form_valid
            self.object.user = User …
▼ Local vars
Variable    Value
User    
<SimpleLazyObject: <User: Jimmy>>
__class__   
<class 'accounts.views.CreateAccount'>
form    
<AccountForm bound=True, valid=True, fields=(first_name;surname;billing_address;delivery_address)>
self    
<accounts.views.CreateAccount object at 0x000001C9E70DBC40>


 line 310, in __set__
        super().__set__(instance, value) …
▼ Local vars
Variable    Value
__class__   
<class 'django.db.models.fields.related_descriptors.ForwardOneToOneDescriptor'>
instance    
Error in formatting: RelatedObjectDoesNotExist: Account has no user.
self    
<django.db.models.fields.related_descriptors.ForwardOneToOneDescriptor object at 0x000001C9E6C72250>
value   
<SimpleLazyObject: <User: Jimmy>>

如果您能提供帮助,请提前致谢。

【问题讨论】:

  • @etnguyen03 在一定程度上 - 我将 Account 模型中的用户变量更改为:
  • 'class Account(models.Model): user = models.OneToOneField(get_user_model(),related_name='customer_account',on_delete=models.CASCADE)'
  • 但是,我现在收到此错误:/accounts/create/ FOREIGN KEY 约束处的 IntegrityError 失败
  • 发生在 CreateView 中 form_valid() 中的 self.object.save 中。这是倒数第二个回溯!:

标签: django


【解决方案1】:

这篇文章真的很有帮助,解决了我遇到的问题:

https://learndjango.com/tutorials/django-best-practices-referencing-user-model

我删除了我的 models.py 文件中的用户模型,然后将我的帐户模型中的“用户”字段更改为:

> user = models.OneToOneField(settings.AUTH_USER_MODEL,related_name='customer_account',on_delete=models.CASCADE)

然后将其保存在 views.py 中(如前所述)以获取视图的用户模型:

from django.contrib.auth import get_user_model
User = get_user_model()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2016-01-17
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2018-01-07
    相关资源
    最近更新 更多