[英]AttributeError: 'CustomUser' object has no attribute 'first_name'
[英]django - AttributeError: 'NoneType' object has no attribute 'first_name'
每当我尝试安装client
时,都会得到一些帮助,以理解以下错误: AttributeError: 'NoneType' object has no attribute 'first_name'
。
这是日志:
Environment:
Request Method: GET
Request URL: http://192.168.33.10:8000/podfunnel/clientsetup/
Django Version: 1.9
Python Version: 2.7.6
Installed Applications:
('producer',
'django.contrib.admin',
'django.contrib.sites',
'registration',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'storages',
'django_extensions',
'randomslugfield',
'adminsortable2',
'crispy_forms')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware')
Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py" in view
68. return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py" in dispatch
88. return handler(request, *args, **kwargs)
File "/home/vagrant/fullcast_project/producer/views/pod_funnel.py" in get
110. initial_values['first_name'] = client.first_name
Exception Type: AttributeError at /podfunnel/clientsetup/
Exception Value: 'NoneType' object has no attribute 'first_name'
它必须在y views.py
下的ClientSetupView
执行:
class ClientSetupView(View):
form_class = ClientSetupForm
template_name = 'pod_funnel/forms.html'
# In the get we manage the request to get the form and prefill it if necessary
def get(self, request, *args, **kwargs):
# We need to check first if the current user has a client and podcast setup,
# if so, prepopulate. Otherwise get empty form.
initial_values = {}
user = request.user
if Client.objects.filter(user=user).exists():
client = CLient.objects.filter(user=user).first()
initial_values['first_name'] = client.first_name
initial_values['last_name'] = client.last_name
podcast = Podcast.objects.filter(client=client).first()
request.session['client_id'] = client.id
if podcast:
initial_values['podcast_name'] = podcast.name
# lets store podcast_id in session so we can retrieve it directly in post
request.session['podcast_id'] = podcast.id
form = self.form_class(initial=initial_values)
return render(request, self.template_name, {'form': form})
# In the the post we manage updates to the data
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# lets get the data
first_name = form.cleaned_data.get('first_name')
last_name = form.cleaned_data.get('last_name')
podcast_name = form.cleaned_data.get('podcast_name')
# First we see if we have a client_id in session, if so we retrieve and update
# otherwise we create a new one.
client_id = request.session.get('client_id', None)
if client_id is not None:
request.session.delete('client_id')
client = Client.objects.get(id=client_id)
else:
client = Client()
client.first_name = first_name
client.last_name = last_name
client.company_name = podcast_name
client.save()
# Now we update or create the associated podcast.
podcast_id = request.session.get('podcast_id', None)
if podcast_id is not None:
request.session.delete('podcast_id')
podcast = Podcast.objects.get(id=podcast_id)
else:
podcast = Podcast()
podcast.client = client
podcast.name = podcast_name
podcast.save()
success, message_list = update_or_create_preset_for_podcast(podcast)
# in any case we can continue with additional podcast setup, but we need
# to attempt to create the preset one more time at some point before the
# user can create the first productions.
return HttpResponseRedirect(reverse('podfunnel:podcastsetup'))
return render(request, self.template_name, {'form': form})
您检查if client is not None
应从数据库读取后立即出现,因为如果没有项目,则first
可能返回None
:
client = Client.objects.filter(user=user).first()
if client is not None:
initial_values['first_name'] = client.first_name
initial_values['last_name'] = client.last_name
或者,您可以使用exists
来测试在first
获取该用户之前是否至少有一个该用户的客户端:
if Client.objects.filter(user=user).exists():
client = Client.objects.filter(user=user).first()
initial_values['first_name'] = client.first_name
initial_values['last_name'] = client.last_name
exists
方法更有效:
如果QuerySet包含任何结果,则返回True,否则返回False。 这试图以最简单,最快的方式执行查询,但是它执行的查询与普通QuerySet查询几乎相同。
根据文档,如果没有匹配项, first()
将返回None
:
返回与查询集匹配的第一个对象,如果没有匹配的对象,则返回None。
换句话说,执行以下行后, client
具有None
值:
client = Client.objects.filter(user=user).first()
这意味着当前用户没有客户端。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.