__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 файла. Когда я отделил функцию сохранения, она не имеет места для отправки пустых полей, что позволяет мне загрузить экземпляр во все поля и сохранить их с помощью второй функции.

.
Вернуться на верх