w_lpz w_lpz - 1 year ago 84
Python Question

django - AttributeError: 'NoneType' object has no attribute 'first_name'

Would appreciate some help understanding whenever I try to setup my

I am getting the following error:
AttributeError: 'NoneType' object has no attribute 'first_name'

Here is the log:


Request Method: GET
Request URL:

Django Version: 1.9
Python Version: 2.7.6
Installed Applications:
Installed Middleware:


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'

It has to do in my
under y

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:
client = Client.objects.get(id=client_id)
client = Client()
client.first_name = first_name
client.last_name = last_name
client.company_name = podcast_name

# Now we update or create the associated podcast.
podcast_id = request.session.get('podcast_id', None)
if podcast_id is not None:
podcast = Podcast.objects.get(id=podcast_id)
podcast = Podcast()
podcast.client = client
podcast.name = podcast_name

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})

Answer Source

The line were you check if client is not None should come immediately after reading from the database as first may return None if there are no items:

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

Or you can use exists to test if there is at least one client for that user before fetching 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

The exists approach is more efficient:

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.