django - AttributeError: 'NoneType' 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'
它必须在我 ClientSetupView
下 y views.py
:
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})
根据文档 first()
将 return None
如果没有匹配项:
Returns the first object matched by the queryset, or None if there is no matching object.
换句话说,client
在执行此行后具有 None
值:
client = Client.objects.filter(user=user).first()
这意味着当前用户没有客户端。
您检查的行 if client is not None
应该在从数据库读取后立即出现,因为 first
如果没有项目,可能 return 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
方法更有效:
Returns True if the QuerySet contains any results, and False if not.
This tries to perform the query in the simplest and fastest way
possible, but it does execute nearly the same query as a normal
QuerySet query.
每当我尝试设置我的 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'
它必须在我 ClientSetupView
下 y views.py
:
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})
根据文档 first()
将 return None
如果没有匹配项:
Returns the first object matched by the queryset, or None if there is no matching object.
换句话说,client
在执行此行后具有 None
值:
client = Client.objects.filter(user=user).first()
这意味着当前用户没有客户端。
您检查的行 if client is not None
应该在从数据库读取后立即出现,因为 first
如果没有项目,可能 return 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
方法更有效:
Returns True if the QuerySet contains any results, and False if not. This tries to perform the query in the simplest and fastest way possible, but it does execute nearly the same query as a normal QuerySet query.