检查用户之前是否用 Django 填写过问卷

Check if user had filled questionnaire before with Django

我正在做一份调查问卷,我制作了一个页面,用户可以在其中列出要填写的问卷以及他之前填写过的问卷,但我卡住了。 我喜欢检查用户之前是否填写了 form/questionnaire 以及他是否没有向他展示问卷 link。 我的解决方案不起作用,因为它会在用户填写问卷时检查数据库,但如果他没有填写(数据库中没有他的行),它会在我的 table 中显示一个空白单元格。 (我不知道 exists query 是否是一个解决方案,但我无法让它工作)

main.html

    {% for i in oke_vezetoi %}
      {% if i.vezetoi_ok == True %}
          <td><button class="btn btn-sm btn-outline-info"> <a href="{% url 'stressz:vezetoi_item' %}">Kitöltöm</a></button>      
          <td><i class="fas fa-running fa-2x text-dark"></i></td>
      {% else %}
          <td class="text-success text-uppercase">Kitöltötted</button>      
          <td><i class="fas fa-check fa-2x text-success"></i></td>     
      {% endif %}  
    {% endfor %}

views.py

def main(request):
    
    oke_vezetoi = Vezetoi.objects.filter(user_name=request.user)
    oke_stressz = Stressz_teszt.objects.filter(user_name=request.user)

    context = {
        'oke_vezetoi': oke_vezetoi,
        'oke_stressz': oke_stressz,
    }
    return render(request, 'stressz/main.html', context)

models.py

class Vezetoi(models.Model):
    
    def __str__(self):
        return str(self.user_name)

    user_name = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    vezetoi_v01 = models.IntegerField(  null=True)
    vezetoi_v02 = models.IntegerField(  null=True)
    vezetoi_v03 = models.IntegerField(  null=True)
    vezetoi_v04 = models.IntegerField(  null=True)
    vezetoi_v05 = models.IntegerField(  null=True)
    vezetoi_v06 = models.IntegerField(  null=True)
    vezetoi_v07 = models.IntegerField(  null=True)
    vezetoi_v08 = models.IntegerField(  null=True)
    vezetoi_v09 = models.IntegerField(  null=True)
    vezetoi_v10 = models.IntegerField(  null=True)
    vezetoi_v11 = models.IntegerField(  null=True)
    vezetoi_v12 = models.IntegerField(  null=True)
    vezetoi_ok = models.BooleanField()

forms.py

class VezetoiForm(forms.ModelForm):
    class Meta:
        model = Vezetoi
        fields = ['vezetoi_v01', 'vezetoi_v02', 'vezetoi_v03', 'vezetoi_v04', 'vezetoi_v05', 'vezetoi_v06', 'vezetoi_v07', 'vezetoi_v08', 'vezetoi_v09', 'vezetoi_v10', 'vezetoi_v11', 'vezetoi_v12', 'vezetoi_ok' ]

我不确定我是否正确解释了你的问题,但似乎有一些你可以优化的地方。

  1. 听起来 Vezetoi 模型中每个用户应该只有一个条目。

如果这是真的,你应该强制执行 ForeignKey(unique=True),你不需要 for 循环,你可以在 views.py

中使用 Vezetoi.objects.get()

如果这不是真的,并且每个用户有多个 Vezetoi 个整数,您可能希望每个整数都有一个 Vezetoi 对象。

  1. 如果用户没有提交问卷,那么Vezetoi模型对象将不存在。
  • 由于对象不存在,它不会出现在oke_vezetoi查询集中,所以对象属性i.vezetoi_ok不会在你的循环中找到(这这就是为什么你的 table 行是空白的)。

  • 假设字段vezetoi_ok仅用于检查问卷是否存在,它只能为真,因此您可以将其从模型定义中删除。

如果这些不正确,我将需要修改答案,我会要求您提供更多信息,以了解这些模型正在跟踪的内容、Stressz_teszt 模型的内容以及 urls.py 以及 VezetoiForm 的实现方式。

所以在我所描述的情况下,我会使用基于 class 的视图和 get_context_data 方法来做到这一点。

models.py

class Vezetoi(models.Model):

    def __str__(self):
        return str(self.user_name)

    user_name = models.ForeignKey(User, on_delete=models.CASCADE, unique=True)
    vezetoi_v01 = models.IntegerField(null=True)
    ...
    # vezetoi_ok = models.BooleanField()

forms.py

class VezetoiForm(forms.ModelForm):
    class Meta:
        model = Vezetoi
        fields = '__all__'

views.py

class MainView(TemplateView):
    template_name = 'main.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data()
        context['oke_vezetoi'] = Vezetoi.objects.get(user_name=request.user)
        context['oke_stressz'] = Stressz_teszt.objects.get(user_name=request.user)
        return context

main.html

{% extends 'base.html' %}
{% if oke_vezetoi %}
    {# do not display link #}
{% else %}
    {# display link #}
{% endif %}