【问题标题】:RelatedObjectDoesNotExist ExceptionRelatedObjectDoesNotExist 异常
【发布时间】:2017-05-20 13:57:44
【问题描述】:

我试图定义登录用户的前缀,但我得到了这个异常RelatedObjectDoesNotExist。问题是 django 找不到用户 Student 和 Parent(异常值:用户没有学生)

我想根据用户的类型渲染不同的模板

models.py

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


# Create your models here.


class Teacher(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    prefix = 't'

    def __str__(self):
        return self.user.first_name + ' ' + self.user.last_name


class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    parent = models.ForeignKey('Parent', null=True)
    prefix = 's'

    def __str__(self):
        return self.user.first_name + ' ' + self.user.last_name


class Parent(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    prefix = 'p'

    def __str__(self):
        return self.user.first_name + ' ' + self.user.last_name

views.py

def sign_in(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_login = User.objects.get(username=username)
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user_login)
            if user_login.student.prefix == 'S':
                return render(request, 's.html')
            if user_login.teacher.prefix == 'T':
                return render(request, 't.html')
            if user_login.parent.prefix == 'P':
                return render(request, 'p.html')
        else:
            return render(request, 'index.html', {'error': True})
    else:
        return render(request, 'index.html')
系统检查未发现任何问题(0 静音)。 2017 年 5 月 20 日 - 21:43:51 Django 1.11.1 版,使用设置'e_diary.settings' 在 http://127.0.0.1:8000/ 启动开发服务器 使用 CTRL-BREAK 退出服务器。 [20/5/2017 21:43:56]“GET / HTTP/1.1”200 983 内部服务器错误:/sign_in/ 回溯(最近一次通话最后): 文件“C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py”,第 41 行,在内部 响应 = get_response(请求) _get_response 中的文件“C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py”,第 187 行 response = self.process_exception_by_middleware(e, request) _get_response 中的文件“C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py”,第 185 行 响应 = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件“C:\Users\USER\Desktop\e_diary\electronic_diary\views.py”,第 29 行,在 sign_in 如果 user_login.teacher.prefix == 'T': 文件“C:\Users\USER\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\fields\related_descriptors.py”,第 406 行,在 __get__ self.related.get_accessor_name() django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist:用户没有老师。 [20/5/2017 21:44:02]“POST /sign_in/HTTP/1.1”500 70872

【问题讨论】:

  • 展示你的模型
  • @SakeBolatbek - StackOverflow 上通常不赞成您的代码截图。只需将您的代码复制粘贴到问题中即可。如果您遇到格式问题,我们可以为您解决。另外,请花一些时间考虑您的问题的细节 - 您面临什么问题,堆栈跟踪是什么,以及期望的结果是什么。这样,您可以获得更好的响应。

标签: django django-models django-views


【解决方案1】:

您可以在 Student、Teacher 表中为字段用户设置一个 related_name,如下所示,

user = models.OneToOneField(User, related_name='student')

此外,您需要确保为用户创建了相应的学生、父母、模型。

此外,您正在检查大写字母的前缀,在您的模型中它们是小写字母。 Python 严格区分大小写。

我认为你也需要更改 if 语句,

try:
    if user_login.student.prefix == 'S'
        return render(request, 's.html')
except:
    try:
        if user_login.teacher.prefix == 'T'
            return render(request, 't.html')
    except:
        if user_login.parent.prefix == 'P':
            return render(request, 'p.html')

因为,在您的视图中,每个 if 语句 在视图期间都会遇到。那么如果用户是教师,那么它就没有学生对象。然后,Django 引发错误。因此,最好使用 try-except 组合。

另外,从您的代码中,我提出了关于 Student、Teacher、Parent 模型的建议。 您可以使用具有两个标志 is_teacher、is_parent 和默认空 ForeignKey 字段的单个模型配置文件,该字段仅在 is_parent 标志为 True 时设置,而不是在数据库中重复创建表。 但是,这只是一个建议,因为在您的方法中,学生、教师、家长可以轻松区分,尽管它占用更多存储空间。

【讨论】:

  • 你能发布你的完整堆栈跟踪吗?
  • 如果用户既不是学生也不是老师也不是父母,如何处理。
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 2015-01-19
  • 1970-01-01
  • 2020-07-17
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多