Django AttributeError和查询不存在错误

时间:2018-09-28 06:54:18

标签: django django-models django-views

文件“ 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', {})			
    			

1 个答案:

答案 0 :(得分:0)

AttributeError

该错误源于Mycheque.related关系为可空的事实:可以将其设置为NULL

这意味着对于某些Mychequeself.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行,并在正确的位置处理错误。