【问题标题】:How to filter some items in a manytomany field in Django如何在 Django 中过滤多对多字段中的某些项目
【发布时间】:2021-02-11 22:23:07
【问题描述】:

我正在尝试在我的应用程序中创建一个公告系统,让院长可以创建一个公告并选择他要发送给的学生。我希望有一种方法能够仅过滤他/她页面上的特定学生公告。

注意:通常,如果我在模板中编写代码 {{request.user}},我会得到“AnonymousUser”,这是预期的,因为没有实现普通的 django 用户模块,但是自定义用户模型。这表明 request.user.id 无效,因此我不能使用它来过滤。

我希望我能找到一些其他方法来过滤每个学生的公告。

models.py

class Announcement_by_dean(models.Model):
    student_id = models.ManyToManyField(add_students_by_manager)
    message = models.TextField()
    sent_date = models.DateField(default=datetime.now(), blank=True)
    updated_date = models.DateField(auto_now=True, blank=True)

    def __str__(self):
        return self.id

class add_students_by_manager(models.Model):
    manager_ID = models.ForeignKey(Manager_login_information, on_delete=models.CASCADE)
    student_ID = models.CharField(max_length=200)
    student_name = models.CharField(max_length=200)
    phone_number = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    dob = models.CharField(max_length=200)
    major = models.CharField(max_length=200)
    password = models.CharField(max_length=200)

    def __str__(self):
        return self.student_name

views.py

def student_course_list(request):

    stu_course_id = request.POST.get('stu_course_id')
    my_announcement = Announcement_by_dean.objects.filter(student_id=request.user.id).order_by('-sent_date')
    print(my_announcement)

    context = {"my_announcement":my_announcement}
    return render(request, "student_course_list.html", context)

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    问题似乎是您试图将模型实例与该实例的 ID 进行比较。将其更改为此应该可以解决问题:

    my_announcement = Announcement_by_dean.objects.filter(student_id__id=request.user.id).order_by('-sent_date')
    

    正如您在上面的示例中看到的那样,您的命名约定有点混乱。您可能需要考虑阅读一下 django 编码风格:https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/

    如果不是登录用户(request.user),则可以在 URL 中传入学生 ID,如下所示:www.yourdomain.com/yourviewurl/?student_id= 然后将您的代码更改为:

    def student_course_list(request):
    
        stu_course_id = request.POST.get('stu_course_id')
        my_announcement = Announcement_by_dean.objects.filter(student_id=request.GET['student_id']).order_by('-sent_date')
    

    或者你可以在你的 urls.py 中指定一个捕获的值(见这里:https://docs.djangoproject.com/en/3.1/topics/http/urls/) 并将您的代码更改为:

    def student_course_list(request, student_id):
    
        stu_course_id = request.POST.get('stu_course_id')
        my_announcement = Announcement_by_dean.objects.filter(student_id=student_id).order_by('-sent_date')
    

    【讨论】:

    • 通常,如果我在模板中编写代码 {{request.user}},我会得到“AnonymousUser”,这是预期的,因为没有实现普通的 django 用户模块,而是自定义用户模型.
    • 我希望我能找到一种方法来过滤仅与特定学生有关的公告。
    • 上面的更新答案
    猜你喜欢
    • 2018-06-07
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2020-03-20
    • 1970-01-01
    • 2012-08-23
    • 2011-07-26
    相关资源
    最近更新 更多