Как мне поступить с нулевым запросом в Django? - PullRequest
2 голосов
/ 12 июля 2020

Итак, позвольте мне начать с процесса регистрации на моей веб-странице. Пользователь сначала зарегистрируется, а затем сразу после регистрации он / она будет перенаправлен на страницу, где пользователь должен ввести свою личную информацию, такую ​​как самовведение, полное имя и т. Д. c. Когда пользователь завершит заполнение своей личной информации, он будет перенаправлен на домашнюю страницу.

Я хотел сделать следующее: когда пользователь пытается получить доступ к домашней странице, проверьте, вошел ли он / она в систему. Если да, проверьте, ввел ли он / она личную информацию. Если нет, перенаправьте пользователя на страницу регистрации. Если пользователь заполнил (= существует соответствующий запрос), перенаправьте его / ее на домашнюю страницу. Если нет, перенаправьте его / ее на страницу личной информации, чтобы заполнить поля.

А вот мой код в views.py

def userHome(request):
    if request.user.is_authenticated:
        current_user = request.user

        if PersonalInfo.objects.get(authuser_id=current_user.id).exists():

            context = {
                'thisUser' : thisUser,
                'newSeed' : newSeed
            }
            return render(request, '/userhome.html', context)

        else: 
            return redirect('/inputpersonalinfo')

    else:
        return redirect('/register')

models.py

from django.db import models
from django.contrib.auth.models import User

class PersonalInfo(models.Model):
    objects = models.Manager()

    authuser = models.OneToOneField(User, on_delete=models.CASCADE, related_name = 'personalinfo', null=True, default=None)
    name = models.CharField(max_length=50)
    ...

Я все время получаю сообщение об ошибке: PersonalInfo matching query deos not exist. Я понимаю, почему это происходит, но не могу придумать решение. Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Даже если уже предоставленный ответ работает, я бы не стал просто использовать exists() просто потому, что я часто использую результат запроса, а exists() не возвращает объект. В вашем случае я бы предпочел сделать что-то вроде этого:

try:
    info = PersonalInfo.objects.get(authuser_id=current_user.id)
    context = {
        'thisUser' : thisUser,
        'newSeed' : newSeed,
        'someinfo' : info.whatever
    }
    return render(request, '/userhome.html', context)
except PersonalInfo.DoesNotExist:
    return redirect('/inputpersonalinfo')
1 голос
/ 12 июля 2020

Вы должны использовать filter вместо get, когда вы проверяете, существует ли PersonalInfo:

PersonalInfo.objects.filter(authuser_id=current_user.id).exists()

get выдает ошибку, если нет объекта, соответствующего запросу. filter вернет пустой набор запросов.

См. Пример в документации и вопрос о get vs. filter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...