AttributeError: 'NoneType' object has no attribute 'get' - How to solve it when I even have the data and no field is None?
AttributeError: 'NoneType' object has no attribute 'get' - How to solve it when I even have the data and no field is None?
我正在创建 Django 应用程序。我将写下系统应该如何工作的简短摘要,然后我将分享我的代码。
当用户(学生)转到 performance_calculator.html
时,he/she 会看到一个文本框,he/she 必须在其中输入相关的主题名称。输入主题名称后,he/she 将单击 'Calculate' 按钮,在另一端(服务器端)将采用输入的名称,系统将搜索该主题的详细信息(进度)使用主题名称和该用户名作为过滤器的详细模型中的用户(学生)。获取进度详细信息后,详细信息中的每个值都将分配给单独的单个变量。这些变量将作为参数传递给 fuzz_algo()
函数(计算器性能的模糊逻辑算法),得到结果后,结果将使用 Django 消息模块转发到客户端(前端)。
这是总结,现在我在系统尝试获取用户(使用系统的学生)的主题(用户输入的名称)的进度详细信息时出错。错误是 AttributeError: 'NoneType' object has no attribute 'get'
。我知道当我们从某处收到 None
并尝试从 None
获取某些内容时会发生此错误。但是我已经使用管理面板填充了详细模型和主题模型(附上屏幕截图)。我不知道为什么我得到 None
并且由于 None
,这个 AttributeError
。
我的views.py
def performanceCalculator(request):
skype = 0
internal_course = 0
prg_lab = 0
mid_marks = 0
final_marks = 0
sub = 0
if request.method == 'POST':
performance_form = PerformanceCalculatorForm(request.POST)
if performance_form.is_valid():
performance_form.save()
sub = performance_form.cleaned_data.get('subject')
skype = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('skype_session_attendance')
internal_course = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('internal_course_marks')
prg_lab = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('programming_lab_activity')
mid_marks = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('mid_term_marks')
final_marks = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('final_term_marks')
result = fuzz_algo(skype, internal_course, prg_lab, mid_marks, final_marks)
messages.success(request, result)
return redirect('performance_calculator')
else:
performance_form = PerformanceCalculatorForm()
context = {
'performance_form': performance_form
}
return render(request, 'users/performance_calculator.html', context)
我的models.py
class Subject(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
subject = models.CharField(max_length=100)
def __str__(self):
return '{} ({})'.format(self.subject, self.user.username)
class Detail(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
subject = models.OneToOneField(Subject, on_delete=models.CASCADE)
skype_session_attendance = models.FloatField()
internal_course_marks = models.FloatField()
programming_lab_activity = models.FloatField()
mid_term_marks = models.FloatField()
final_term_marks = models.FloatField()
def __str__(self):
return f'{self.subject, (self.user.username)} Details'
class Sub(models.Model):
s = models.CharField(max_length=100
我的forms.py
class PerformanceCalculatorForm(forms.ModelForm):
subject = forms.CharField(max_length=100)
class Meta:
model = Sub
fields = ['subject']
我的模板(users/performance_calculator.html)
{% if not request.user.is_superuser and not request.user.is_staff %}
<div class="account-heading">
<h2>
Performance Calculator
</h2>
</div>
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4"></legend>
{{ performance_form|crispy }}
</fieldset>
<div class="from-group">
<button class="btn btn-outline-info" type="submit">Calculate</button>
</div>
</form>
</div>
{% endif %}
这是我得到的完整错误:
AttributeError at /esacp/performance-calculator/
'NoneType' object has no attribute 'get'
Request Method: POST
Request URL: http://localhost:8000/esacp/performance-calculator/
Django Version: 3.0.3
Exception Type: AttributeError
Exception Value:
'NoneType' object has no attribute 'get'
Exception Location: C:\Users\khubi\OneDrive\Desktop\FYP\test_phase\users\views.py in performanceCalculator, line 61
Python Executable: C:\environments\bsse_fyp\Scripts\python.exe
Python Version: 3.8.1
Python Path:
['C:\Users\khubi\OneDrive\Desktop\FYP\test_phase',
'C:\Users\khubi\AppData\Local\Programs\Python\Python38-32\python38.zip',
'C:\Users\khubi\AppData\Local\Programs\Python\Python38-32\DLLs',
'C:\Users\khubi\AppData\Local\Programs\Python\Python38-32\lib',
'C:\Users\khubi\AppData\Local\Programs\Python\Python38-32',
'C:\environments\bsse_fyp',
'C:\environments\bsse_fyp\lib\site-packages']
Server time: Thu, 14 May 2020 11:55:41 +0000
现在,下面是管理面板的屏幕截图,显示了填充的主题和详细信息模型:
这是主要的 Django 管理面板,看到右侧的操作了吗?
这是主题模型,看到添加了 4 个主题,一个学生有 2 个,其他学生有 2 个。
这是用户(学生)的一个主题的详细模型。查看详细信息已输入且字段不是 None
或为空
现在我不明白,为什么我会得到没有空的错误。
P.S。是的,我使用同一用户(学生)登录,其主题详细信息显示在上面的屏幕截图中。如果您在模板中看到,我在开始时有 if condition
,如果用户不是员工也不是超级用户,那么只会显示该表单。所以很明显,登录 Django 管理面板后,我不会看到性能计算器表单,如果我使用常规帐户登录,我只会看到该表单。但我仍然收到错误。
在 forms.py
中,您已将 Meta.model
设置为 Sub
,将 Meta.fields
设置为 ['subject']
在 models.py
中,模型 Sub
没有 'subject' 属性。
澄清:这次通过查看整个代码,您已经将数据插入到数据库中,而您的表单只是对这些数据执行 GET ...因此,为了性能,不应保存表单(因为每次 POST 时都会创建新对象)。这意味着更好的方法应该编码为 GET 而不是 POST...
但可以说这是一个特例,你想这样做是因为你想...
这次我会直接修改你的代码,第一次看很头疼,因为查询太多,效率很低。
views.py
def performanceCalculator(request):
if request.method == 'POST':
performance_form = PerformanceCalculatorForm(request.POST)
if performance_form.is_valid():
#performance_form.save() #dont save because you dont need to.
#just process it by getting the data
sub = performance_form.cleaned_data['subject']
detail = Detail.objects.all().filter(user=request.user, subject=sub).first()
#get the unique object that matches the filters
#and I think what is causing you the Nonetype error is your queries
#(I saw filter(subject__subject=...) and the OneToOneField doesn't
#behave the same as a ForeignKey and that may be the case.)
#now fetch every field into the function
result = fuzz_algo(detail.skype_session_attendance, detail.internal_course_marks, detail.programming_lab_activity, detail.mid_term_marks, detail.final_term_marks)
messages.success(request, result) #if it raises int related error, include the str filter later.
return redirect('performance_calculator')
else:
performance_form = PerformanceCalculatorForm()
context = {
'performance_form': performance_form
}
return render(request, 'users/performance_calculator.html', context)
编辑:忘记添加这部分
并且在您的 models.py 中...拥有模型 Subject
并没有多大意义,并且有 2 个用户关系...
所以更简洁的模型是:
#removed the Subject model
class Detail(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
subject = models.CharField(max_length=15) #modified to be a CharField
skype_session_attendance = models.FloatField()
internal_course_marks = models.FloatField()
programming_lab_activity = models.FloatField()
mid_term_marks = models.FloatField()
final_term_marks = models.FloatField()
def __str__(self):
return f'{self.subject, (self.user.username)} Details'
#also the Sub class
编辑: 添加 .first()
以获取查询集
上的第一个对象
我正在创建 Django 应用程序。我将写下系统应该如何工作的简短摘要,然后我将分享我的代码。
当用户(学生)转到 performance_calculator.html
时,he/she 会看到一个文本框,he/she 必须在其中输入相关的主题名称。输入主题名称后,he/she 将单击 'Calculate' 按钮,在另一端(服务器端)将采用输入的名称,系统将搜索该主题的详细信息(进度)使用主题名称和该用户名作为过滤器的详细模型中的用户(学生)。获取进度详细信息后,详细信息中的每个值都将分配给单独的单个变量。这些变量将作为参数传递给 fuzz_algo()
函数(计算器性能的模糊逻辑算法),得到结果后,结果将使用 Django 消息模块转发到客户端(前端)。
这是总结,现在我在系统尝试获取用户(使用系统的学生)的主题(用户输入的名称)的进度详细信息时出错。错误是 AttributeError: 'NoneType' object has no attribute 'get'
。我知道当我们从某处收到 None
并尝试从 None
获取某些内容时会发生此错误。但是我已经使用管理面板填充了详细模型和主题模型(附上屏幕截图)。我不知道为什么我得到 None
并且由于 None
,这个 AttributeError
。
我的views.py
def performanceCalculator(request):
skype = 0
internal_course = 0
prg_lab = 0
mid_marks = 0
final_marks = 0
sub = 0
if request.method == 'POST':
performance_form = PerformanceCalculatorForm(request.POST)
if performance_form.is_valid():
performance_form.save()
sub = performance_form.cleaned_data.get('subject')
skype = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('skype_session_attendance')
internal_course = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('internal_course_marks')
prg_lab = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('programming_lab_activity')
mid_marks = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('mid_term_marks')
final_marks = Detail.objects.filter(subject__subject=sub, user__username=User.username).values().first().get('final_term_marks')
result = fuzz_algo(skype, internal_course, prg_lab, mid_marks, final_marks)
messages.success(request, result)
return redirect('performance_calculator')
else:
performance_form = PerformanceCalculatorForm()
context = {
'performance_form': performance_form
}
return render(request, 'users/performance_calculator.html', context)
我的models.py
class Subject(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
subject = models.CharField(max_length=100)
def __str__(self):
return '{} ({})'.format(self.subject, self.user.username)
class Detail(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
subject = models.OneToOneField(Subject, on_delete=models.CASCADE)
skype_session_attendance = models.FloatField()
internal_course_marks = models.FloatField()
programming_lab_activity = models.FloatField()
mid_term_marks = models.FloatField()
final_term_marks = models.FloatField()
def __str__(self):
return f'{self.subject, (self.user.username)} Details'
class Sub(models.Model):
s = models.CharField(max_length=100
我的forms.py
class PerformanceCalculatorForm(forms.ModelForm):
subject = forms.CharField(max_length=100)
class Meta:
model = Sub
fields = ['subject']
我的模板(users/performance_calculator.html)
{% if not request.user.is_superuser and not request.user.is_staff %}
<div class="account-heading">
<h2>
Performance Calculator
</h2>
</div>
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4"></legend>
{{ performance_form|crispy }}
</fieldset>
<div class="from-group">
<button class="btn btn-outline-info" type="submit">Calculate</button>
</div>
</form>
</div>
{% endif %}
这是我得到的完整错误:
AttributeError at /esacp/performance-calculator/
'NoneType' object has no attribute 'get'
Request Method: POST
Request URL: http://localhost:8000/esacp/performance-calculator/
Django Version: 3.0.3
Exception Type: AttributeError
Exception Value:
'NoneType' object has no attribute 'get'
Exception Location: C:\Users\khubi\OneDrive\Desktop\FYP\test_phase\users\views.py in performanceCalculator, line 61
Python Executable: C:\environments\bsse_fyp\Scripts\python.exe
Python Version: 3.8.1
Python Path:
['C:\Users\khubi\OneDrive\Desktop\FYP\test_phase',
'C:\Users\khubi\AppData\Local\Programs\Python\Python38-32\python38.zip',
'C:\Users\khubi\AppData\Local\Programs\Python\Python38-32\DLLs',
'C:\Users\khubi\AppData\Local\Programs\Python\Python38-32\lib',
'C:\Users\khubi\AppData\Local\Programs\Python\Python38-32',
'C:\environments\bsse_fyp',
'C:\environments\bsse_fyp\lib\site-packages']
Server time: Thu, 14 May 2020 11:55:41 +0000
现在,下面是管理面板的屏幕截图,显示了填充的主题和详细信息模型:
这是主要的 Django 管理面板,看到右侧的操作了吗?
这是主题模型,看到添加了 4 个主题,一个学生有 2 个,其他学生有 2 个。
这是用户(学生)的一个主题的详细模型。查看详细信息已输入且字段不是 None
或为空
现在我不明白,为什么我会得到没有空的错误。
P.S。是的,我使用同一用户(学生)登录,其主题详细信息显示在上面的屏幕截图中。如果您在模板中看到,我在开始时有 if condition
,如果用户不是员工也不是超级用户,那么只会显示该表单。所以很明显,登录 Django 管理面板后,我不会看到性能计算器表单,如果我使用常规帐户登录,我只会看到该表单。但我仍然收到错误。
在 forms.py
中,您已将 Meta.model
设置为 Sub
,将 Meta.fields
设置为 ['subject']
在 models.py
中,模型 Sub
没有 'subject' 属性。
澄清:这次通过查看整个代码,您已经将数据插入到数据库中,而您的表单只是对这些数据执行 GET ...因此,为了性能,不应保存表单(因为每次 POST 时都会创建新对象)。这意味着更好的方法应该编码为 GET 而不是 POST...
但可以说这是一个特例,你想这样做是因为你想... 这次我会直接修改你的代码,第一次看很头疼,因为查询太多,效率很低。
views.py
def performanceCalculator(request):
if request.method == 'POST':
performance_form = PerformanceCalculatorForm(request.POST)
if performance_form.is_valid():
#performance_form.save() #dont save because you dont need to.
#just process it by getting the data
sub = performance_form.cleaned_data['subject']
detail = Detail.objects.all().filter(user=request.user, subject=sub).first()
#get the unique object that matches the filters
#and I think what is causing you the Nonetype error is your queries
#(I saw filter(subject__subject=...) and the OneToOneField doesn't
#behave the same as a ForeignKey and that may be the case.)
#now fetch every field into the function
result = fuzz_algo(detail.skype_session_attendance, detail.internal_course_marks, detail.programming_lab_activity, detail.mid_term_marks, detail.final_term_marks)
messages.success(request, result) #if it raises int related error, include the str filter later.
return redirect('performance_calculator')
else:
performance_form = PerformanceCalculatorForm()
context = {
'performance_form': performance_form
}
return render(request, 'users/performance_calculator.html', context)
编辑:忘记添加这部分
并且在您的 models.py 中...拥有模型 Subject
并没有多大意义,并且有 2 个用户关系...
所以更简洁的模型是:
#removed the Subject model
class Detail(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
subject = models.CharField(max_length=15) #modified to be a CharField
skype_session_attendance = models.FloatField()
internal_course_marks = models.FloatField()
programming_lab_activity = models.FloatField()
mid_term_marks = models.FloatField()
final_term_marks = models.FloatField()
def __str__(self):
return f'{self.subject, (self.user.username)} Details'
#also the Sub class
编辑: 添加 .first()
以获取查询集