Django AttributeError и ошибка запроса не существует - PullRequest
0 голосов
/ 28 сентября 2018

Файл "C: \ Users \ NICSI \ Desktop \ lastnow \ mynew \ check \ models.py", строка 39, в st r return (self.related.relation.username) .title () AttributeError: у объекта «NoneType» нет атрибута «отношение» [28 / Sep / 2018 12:36:49] «GET / admin / check / 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 голосов
/ 28 сентября 2018

AttributeError

Ошибка возникает из-за того, что отношение Mycheque.related равно NULLable: его можно установить равным NULL.

Это означает, что для некоторых Mycheque s, объект self.related будет None, и поэтому self.related.relation выдаст ошибку.

Таким образом, вы добавите некоторую логику в __str__ для обработки этого случая, например:

def __str__(self):
    if <b>self.related</b>:
        return self.related.relation.username.title()
    else:
        return 'no related!'

При этом я нахожу функцию __str__ довольно "странной": текстовое представление Mycheque учитывает только объект related.relation?Так что вам стоит подумать об изменении этого.

Один и тот же "сканарио" может происходить в нескольких местах, поэтому вам следует запустить поиск и исправить его соответствующим образом

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 - это a User объект, поэтому он эквивалентен:

userdata = request.user

Другие особенности в представлении заключаются в том, что вы выполняете аутентификацию самостоятельно, вместо использования @login_required [Django-doc] , и, кроме того, здесь определенно имеет смысл определить ModelForm [Django-doc] , с помощью формы вид, вероятно, будет уменьшен до 5-7 строк, а ошибки будут обработаны в правильном месте.

...