__str__ возвращает нестроку (тип NoneType) и удаляет данные из базы данных
Может ли кто-нибудь помочь мне с проблемой, с которой я столкнулся. Я пытаюсь сделать базовый брачный сайт, где пользователь может загрузить свой профиль и администратор должен просмотреть его перед появлением сайта. первая часть загрузки данных в базу данных работала нормально. Я мог добавлять, изменять и удалять. Когда я попытался добавить модуль userForeignKey для автоматического добавления пользователя, я начал сталкиваться с этой ошибкой "str returned non-string (type NoneType)" и он удаляет все данные этого профиля из базы данных в тот момент, когда я нажимаю на редактирование конкретного профиля (до открытия формы с экземпляром он удаляет все данные) и возвращает эту ошибку, все данные внутри просто отображаются в базе данных как null. Я попробовал удалить модуль и вернуть его на ту же позицию, где он работал раньше, но, к сожалению, я не смог сделать все как раньше и все еще сталкиваюсь с той же проблемой.
вот мой код :
МОДЕЛЬ:
class matrimony_db(models.Model):
category = (
('MALE', 'Male'),
('FEMALE', 'Female'),
)
challenge = (
('Yes', 'Yes'),
('No', 'No'),
)
ms = (
('Single', 'Single'),
('Married', 'Married'),
('Divorced', 'Divorced'),
('widow', 'widow'),
('widower', 'widower'),
)
# personal details
img = models.ImageField(upload_to = 'matrimony/')
name = models.CharField(max_length=100,null = True, blank = True)
dob = models.DateField(null = True, blank = True)
gender = models.CharField(max_length = 10, choices = category,null = True, blank = True)
phone = models.CharField(max_length=50,null = True, blank = True)
bio = models.TextField(null = True, blank = True)
# occupation and educations
occupation = models.CharField(max_length = 200,null = True, blank = True)
Highest_Education = models.CharField(max_length = 500,null = True, blank = True)
# physical details
Height = models.CharField(max_length = 200,null = True, blank = True)
weight = models.CharField(max_length = 200,null = True, blank = True)
physical_challenge=models.CharField(max_length = 10, choices = challenge,null = True, blank = True)
Physical_remarks = models.CharField(max_length = 500,null = True, blank = True)
# PErsonal details
Marital_status = models.CharField(max_length=50, choices = ms,null = True, blank = True)
Languages = models.CharField(max_length = 200,null = True, blank = True)
currentplace = models.CharField(max_length = 200,null = True, blank = True)
# Family details
father = models.CharField(max_length=200,null = True, blank = True)
mother = models.CharField(max_length=200,null = True, blank = True)
mother_occupation = models.CharField(max_length=200,null = True, blank = True)
father_occupation = models.CharField(max_length=200,null = True, blank = True)
siblings = models.TextField(null = True, blank = True)
# psouse details
spouse = models.TextField(null = True, blank = True)
def __str__(self):
return self.name
def delete(self, *args, **kwargs):
self.img.delete()
super().delete(*args, **kwargs)
Форма:
class form_matrimony(forms.ModelForm):
class Meta:
model = matrimony_db
fields = '__all__'
Просмотров : * обратите внимание на тот же код, который я использовал для других моделей для обновления, он работает без ошибок, не знаю почему только у этой модели такая проблема.
def view_update_matrimony(request, pk):
book = matrimony_db.objects.get(pk=pk)
form = form_matrimony(instance=book)
if request.method == 'POST':
forms = form_matrimony(request.POST,request.FILES,instance = book )
if forms.is_valid():
forms.save()
sb = str(book)
messages.success(request, 'Files in ' +sb + " updated successfully")
return redirect('admin_matrimony')
else:
form = form_matrimony()
return render(request,'admin_loc_matrimony_new.html',{
'form':form
})
Ваш name
является NULL
возвращаемым полем. Если оно содержит NULL
, то на уровне Django/Python это None
, и метод __str__
не должен возвращать None
. Вы можете вызвать встроенную функцию str(…)
[Python-doc] на self.name` для возврата элемента:
class matrimony_db(models.Model):
# ⋮
def __str__(self):
return str(self.name)
В вашем представлении вы также должны инициализировать вашу форму с экземпляром book
:
def view_update_matrimony(request, pk):
book = matrimony_db.objects.get(pk=pk)
if request.method == 'POST':
form = form_matrimony(request.POST, request.FILES, instance=book)
if form.is_valid():
form.save()
sb = str(book)
messages.success(request, 'Files in ' +sb + " updated successfully")
return redirect('admin_matrimony')
else:
# with instance=book ↓ ↓
form = form_matrimony(instance=book)
return render(request,'admin_loc_matrimony_new.html',{ 'form':form })
Вы также должны использовать form
для формы в POST-запросе, а не forms
, поскольку в этом случае при некорректном POST-запросе возникнет ошибка NameError
.
Примечание: Часто лучше использовать
get_object_or_404(…)
[Django-doc], чем использовать.get(…)
[Django-doc] напрямую. В случае, если объект не существует, например, потому что пользователь сам изменил URL,get_object_or_404(…)
приведет к возврату ответа HTTP 404 Not Found, в то время как использование.get(…)
приведет к ответу HTTP 500 Server Error.
сейчас работает, когда я разделил этот код
def view_update_matrimony(request, pk):
book = matrimony_db.objects.get(pk=pk)
if request.method == 'POST':
form = form_matrimony(request.POST, request.FILES, instance=book)
if form.is_valid():
form.save()
sb = str(book)
messages.success(request, 'Files in ' +sb + " updated successfully")
return redirect('admin_matrimony')
else:
# with instance=book ↓ ↓
form = form_matrimony(instance=book)
return render(request,'admin_loc_matrimony_new.html',{ 'form':form })
к двум различным функциям
def view_update_matrimony(request, pk):
book = matrimony_db.objects.get(pk=pk)
form = form_matrimony(instance=book)
return render(request,'admin_loc_matrimony_new.html',{ 'form':form })
def update_matr(request,pk):
book = matr_db.objects.get(pk=pk)
if request.method == 'POST':
form = form_matr(request.POST,request.FILES,instance = book )
if form.is_valid():
form.save()
sb = str(book)
messages.success(request, 'Files in ' +sb + " updated successfully")
return redirect('admin_others')
else:
form = form_matr(instance=book)
и использовал в разных html один для создания и второй для отображения кода экземпляра с первой функцией для отображения и кнопки загрузки, вызывая вторую функцию из представлений для сохранения и добавил урлы в соответствии с этим.
Основная проблема, похоже, связана с form.is_valid() и form.save() в первой функции, которая выполняется в обход условия if(request.method == 'POST') без отправки запроса. Я понятия не имею, почему это работает именно так. Я думаю, что когда я нажимаю кнопку edit, html страница, которая имеет тег формы с методом post, отправляет несохраненные данные еще до загрузки экземпляра и выполнения условия if request.method и сохраняет пустые поля, которые получает из html файла. Когда я отделил функцию сохранения, она не имеет места для отправки пустых полей, что позволяет мне загрузить экземпляр во все поля и сохранить их с помощью второй функции.
.