【问题标题】:Check if user had filled questionnaire before with Django检查用户之前是否使用 Django 填写过问卷
【发布时间】:2021-07-17 09:16:32
【问题描述】:

我正在处理一份调查问卷,我创建了一个页面,用户可以在其中列出要填写的问卷以及他之前填写过的问卷,但我卡住了。 我喜欢检查用户之前是否填写过表格/问卷,以及他是否没有向他展示问卷链接。 我的解决方案不起作用,因为它仅在用户填写问卷时检查数据库,但如果他没有(数据库中没有他的行),它会在我的表格中显示一个空白单元格。 (我不知道是否存在查询可能是一个解决方案,但我无法使其工作)

ma​​in.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' ]

【问题讨论】:

    标签: python django if-statement exists


    【解决方案1】:

    我不确定我是否正确解释了您的问题,但您似乎可以优化一些事情。

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

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

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

    1. 如果用户未提交问卷,则Vezetoi 模型对象将不存在。
    • 由于对象不存在,它不会出现在oke_vezetoi 查询集中,因此在您的循环中将找不到对象属性i.vezetoi_ok(这就是您的表格行为空白的原因)。

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

    如果这些不正确,我需要修改答案,我会要求您提供更多信息,说明这些模型正在跟踪什么、Stressz_teszt 模型和 urls.py 的内容以及如何VezetoiForm 已实现。

    因此,在我所描述的情况下,我会使用基于类的视图和 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
    

    ma​​in.html

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

    【讨论】:

    • 谢谢詹姆斯!我明天试试。
    猜你喜欢
    • 1970-01-01
    • 2020-06-23
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 2011-06-28
    • 1970-01-01
    相关资源
    最近更新 更多