Django师生模型过滤数据

时间:2018-09-10 15:59:23

标签: python html django

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

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模型由某个用户名过滤(可能有所不同)

2 个答案:

答案 0 :(得分:0)

您在这里有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函数基本上会根据提供的student-ID的ID打开该模式。

您应该使用哪个?

这两种方法都行得通,第一种方法是我要采用的方法,因为第二种方法可能会根据学生的数量而大大增加DOM的大小。

希望这会有所帮助!

答案 1 :(得分:0)

简单的解决方案是:

<td><a href="openlink/{{student.username}}"> Download Link </a></td>

然后在views.py中创建一个视图(需要在urls.py中进行链接);

from django.shortcuts import render
def openlink(request, username):
    rows=Row.objects.filter(user = username) 
    return render(request, 'rows_detail.html', {'rows': rows})

模板必须能够使用rows变量。

我想说一句,最好是将用户提交到行模型而不是文本字段。

urlpatterns = [....
path('openlink/<str:username>/', openlink, name="openlink"),]