首页 > 解决方案 > Django师生模型过滤数据

问题描述

我在 Django 中有一个用户模型,其中用户类型字段是教师的“管理员”,否则是“学生”。

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=False)
    username = models.CharField(max_length=25, unique=True) 
    password = models.CharField(max_length=50)
    usertype = models.CharField(max_length=140, null=True)
    teacher = models.ForeignKey(
                    settings.AUTH_USER_MODEL,
                    on_delete=models.CASCADE,
                    null = True
                    )
    objects = UserManager()

我还有一个用于学生数据的 Django 模型:

class Row(models.Model): 
    user = models.TextField(max_length=500, blank=True)
    question = models.TextField(max_length=500, blank=True)
    answer = models.TextField(max_length=500, blank=True)

当老师登录时,我会显示他们的学生列表并希望他们能够查看学生数据的副本(应该弹出一个模式)。

<table>
    <h2>Students Directory: </h2>
        <tr>
           <th>Name</th>
           <th>Email</th>
           <th>Download Data</th>
        </tr>
        {% for student in usertable %}
        <tr> 
            <td>{{ student.first_name }} {{ student.last_name}} </td>
            <td>{{ student.email }}</td>
            <td><a onclick="viewData({{student.username}});"> Download Link </a></td>
       </tr>
         {% endfor %}
</table>

所以,我将学生的用户名传递给 viewData() 并且应该会弹出模式。但是,该函数是用 javascript 编写的,我不能执行类似“Row.objects.all.filter(username=username)”的操作。但是,我无法将已过滤的对象传递到 profile.html,因为我不知道我需要哪个学生的用户名。

可能有一个简单的解决方案,我在某处丢失了。

TLDR - 在我的 profile.html 项目中,我想单击一个按钮并弹出一个模式,其中我的 Django 模型由某个用户名过滤(可能会有所不同)

标签: pythonhtmldjango

解决方案


你有2个选择,

1-当您单击按钮时添加一个 ajax 调用,它像这样从服务器获取特定的用户数据,因此您还需要服务器上的一个函数来处理它。例如,

在 js 中(假设使用了 Jquery)

$.ajax(url_to_student_info_view).done(function() {
    // js to fill data in the modal html
})

在你看来,

from django.core import serializers

def get_student_info(request, student_id):
    return HttpResponse(serializers.serialize('json', [ Row.objects.get(pk=student_id), ]))   # very rough but dont forget to check of the user exists before your return

2-您的另一个选择是为每个学生信息创建一个模式,因此,在您的 html 中,

{% for student in students %}
<div class="modal" id="student-{{ student.id }}">
    <!-- student info here -->
</div>
{% endfor %}

那么你的 js 函数基本上会根据提供的 ID 打开该模式student-ID

你应该使用哪一个?

两者都可以,第一个是我会采取的方法,因为第二个可能会根据学生的数量大幅增加 DOM 的大小。

希望这可以帮助!


推荐阅读