首页 > 解决方案 > 使用if语句过滤django模板中的外键内容

问题描述

我有两个模型,一个是另一个的外键。用户只能提交答案。我正在尝试使用 if 语句检查用户的答案是否退出,然后提交答案按钮应更改模板的更新按钮。

class Assignment(models.Model):
    title = models.CharField(max_length=120)
    slug = models.SlugField(max_length=500)
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    class_or_level = models.ForeignKey(StudentClass, on_delete=models.CASCADE)
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    file = models.FileField(upload_to='assignment', blank=True, null=True)
    Text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)
    date_expire = models.DateTimeField()


class Answer(models.Model):
    slug = models.SlugField(max_length=500)
    assignment = models.ForeignKey(Assignment, on_delete=models.CASCADE)
    student = models.ForeignKey(User, on_delete=models.CASCADE)
    file = models.FileField(upload_to='assignment')
    date_added = models.DateTimeField(auto_now_add=True)

我的观点

class AssignmentView(LoginRequiredMixin, ListView):
    template_name = 'assignment.html'
    context_object_name = 'all_couses'
    now = timezone.now()
    queryset = Course.objects.all()

    def get_context_data(self, **kwargs):
        now = timezone.now()
        context = super(AssignmentView, self).get_context_data(**kwargs)
        context.update({
            'assignment_list': Assignment.objects.filter(class_or_level=self.request.user.student.class_or_level, date_expire__gte=now).order_by('-date_expire'),
        })
        return context

这个模板>用户提交的答案显示他是否提交了其他显示表单喜欢提交答案

{% for assignment in assignment_list %}
<h4>{{  assignment.title|truncatewords:12 }}</h4>
 {% if assignment.answer %}
{{  assignment.answer.file }}
  <button> <a href="">Update Answer</a></button>
    {% else %}
      <button> <a href="">Summit Answer</a></button>
{% endif %}

  {% endfor %}

标签: djangodjango-modelsdjango-formsdjango-viewsdjango-templates

解决方案


您可以更改视图或创建模板标记来识别分配是否具有特定用户的响应,我决定更改视图并向分配对象添加一个新变量,该变量将包含请求用户的信息page 对该作业有答案:

class AssignmentView(LoginRequiredMixin, ListView):
    template_name = 'assignment.html'
    context_object_name = 'all_couses'
    now = timezone.now()
    queryset = Course.objects.all()

    def get_context_data(self, **kwargs):
        now = timezone.now()
        context = super(AssignmentView, self).get_context_data(**kwargs)
        assignment_list = Assignment.objects.filter(
            class_or_level=self.request.user.student.class_or_level,
            date_expire__gte=now
        ).order_by('-date_expire')

        for assignment in assignment_list:
            try:
                assignment.student_answer = Answer.objects.get(
                    assignment=assignment,
                    student=self.request.user
                )
            except Answer.DoesNotExist:
                pass

        context.update({
            'assignment_list': assignment_list,
        })
        return context

然后,在您的模板中,您可以执行以下操作:

{% for assignment in assignment_list %}
    <h4>{{  assignment.title|truncatewords:12 }}</h4>
    {% if assignment.student_answer %}
        {{ assignment.student_answer.file }}
        <button> <a href="">Update Answer</a></button>
    {% else %}
        <button> <a href="">Summit Answer</a></button>
    {% endif %}
{% endfor %}

通过这样做,您将实现您正在寻找的东西。


推荐阅读