文件“ C:\ Users \ NICSI \ Desktop \ lastnow \ mynew \ cheque \ models.py”,第39行,位于 st
r
返回(self.related.relation.username).title()
AttributeError:“ NoneType”对象没有属性“ relation”
[28 / Sep / 2018 12:36:49]“ GET / admin / cheque / mycheque / HTTP / 1.1” 500 301999
异常值:
标志匹配查询不存在。
DJANGO抛出了这两个错误,我该如何解决以显示用户与这些详细信息之间的关系
models.py
class Signs(models.Model):
relation = models.OneToOneField(User, on_delete=models.CASCADE)
department = models.CharField(null=True, blank=True, max_length=1000, help_text="User Department")
mobile = models.CharField(null=True, blank=True, max_length=1000, help_text="User Mobile")
def __str__(self):
return (self.relation.username).title()
class Meta:
verbose_name_plural = "Registration Information"
class Mycheque(models.Model):
related = models.ForeignKey(Signs, on_delete=models.CASCADE, null=True, blank=True)
to_pay = models.CharField(max_length=250, null=True, blank=True)
amount = models.BigIntegerField(default=0, null=True, blank=True)
amount_in_words = models.CharField(max_length=10000, null=True, blank=True)
vouchar_no = models.BigIntegerField(default=0, null=True, blank=True)
dated = models.DateTimeField(auto_now_add=True, null=True, blank=True)
cheque_no = models.BigIntegerField(default=0, null=True, blank=True)
cheque_date = models.CharField(max_length=10, null=True, blank=True)
account_no = models.BigIntegerField(default=0, null=True, blank=True)
def save(self):
self.dated = datetime.now()
super(Mycheque, self).save()
def __str__(self):
return (self.related.relation.username).title()
class Meta:
verbose_name_plural = "Single Cheque Of Users"
views.py
def mycheque(request):
if request.method == "POST":
userdata = User.objects.get(username = request.user)
user_data = Signs.objects.get(relation_id=userdata.id)
if userdata.check_password(passwd) == True:
to_p = request.POST['topay']
amnt = request.POST['amount1']
amnt_in_words = request.POST['amount_string']
vouch_no = request.POST['voucharno']
d = request.POST['date']
cheq_no = request.POST['chequeno']
cheq_date = request.POST['chequedate']
acc_no = request.POST['accountno']
single = Mycheque(to_pay=to_p, amount=amnt, amount_in_words=amnt_in_words, vouchar_no=vouch_no, dated=d, cheque_no=cheq_no, cheque_date=cheq_date, account_no=acc_no)
single.save()
messages.success(request, "Your Cheque is created")
else:
messages.error(request, "Please Try again...")
return render(request, 'cheque/mycheque.html', {})
答案 0 :(得分:0)
AttributeError
该错误源于Mycheque.related
关系为可空的事实:可以将其设置为NULL
。
这意味着对于某些Mycheque
,self.related
对象将是None
,因此self.related.relation
将出错。
因此,您将向__str__
添加一些逻辑以处理这种情况,例如:
def __str__(self):
if self.related:
return self.related.relation.username.title()
else:
return 'no related!'
话虽这么说,我发现__str__
函数颇为“古怪”:Mycheque
的文本表示只考虑了related.relation
对象?因此,您应该考虑重新设计。
同一“ scanario”可能在多个地方发生,因此您应该运行搜索并相应地进行修复
Singns
不存在这可能是由于以下原因:
user_data = Signs.objects.get(relation_id=userdata.id)
奇怪的是,您根本不使用user_data
变量,因此-只要正确实现了视图,就可以删除该行。
话虽这么说,该行本身没有任何意义:您以相反的方式查询ForeignKey
,这意味着对于User
对象,可以有零个,一个或多个Signs
对象。因此使用.filter(..)
更有意义,因为如果没有相关的Signs
(或多个),此查询将出错。
ModelForm
上面的行:
userdata = User.objects.get(username = request.user)
也没有任何意义:request.user
是一个User
对象,所以它等效于:
userdata = request.user
视图中的其他缺点是您自己执行身份验证,而不是使用@login_required
[Django-doc],此外,在这里使用表格来定义ModelForm
[Django-doc]绝对有意义,视图可能减少到5-7行,并在正确的位置处理错误。