我在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模型由某个用户名过滤(可能有所不同)
答案 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"),]