【问题标题】:`If` statement doesn't work`If​​` 语句不起作用
【发布时间】:2015-01-31 18:35:15
【问题描述】:

我写了一个 if 语句,但我不知道为什么它不起作用。

第一个“if 语句”检查用户是否想用英语编写测试 (uzyt.jezyk_egzaminu == 'EN')。它应该只显示英文问题 (pytanie.title)。如果计算机没有找到想要用英语编写测试的用户,请检查其他可能性 (f.e uzyt.jezyk_egzaminu == 'DE') 并以其他语言显示问题。

我只收到英语问题:(似乎一切正常。在页面底部,每个用户都有一个描述(DE 或 EN 或 FR)选择了哪种语言。

You can check this file here

def test_qr(request):
    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="egzamin.pdf"'

    uzyt = UserProfile.objects.all().order_by('user_id')
    pytanie = Pytanie.objects.all().order_by('published')
    pytanieDE = PytanieDE.objects.all().order_by('published')
    pytanieFR = PytanieFR.objects.all().order_by('published')

    p = canvas.Canvas(response)

    for z, uzyt in enumerate(UserProfile.objects.all()):

        if uzyt.jezyk_egzaminu ==  'EN' :

            for i, pytanie in enumerate(Pytanie.objects.all()):
                p.drawString(10, 400 + i*210, ' '+ pytanie.title)
        elif uzyt.jezyk_egzaminu ==  'DE' :
            for i, pytanieDE in enumerate(Pytanie.objects.all()):
                p.drawString(10, 400 + i*210, ' '+ pytanieDE.title)
        elif uzyt.jezyk_egzaminu ==  'FR' :
            for i, pytanieFR in enumerate(Pytanie.objects.all()):
                p.drawString(10, 400 + i*210, ' '+ pytanieFR.title)        


        qrw = QrCodeWidget('http://127.0.0.1:8000/admin/userprofile/userprofile/'+str(uzyt.user_id)+'/') 
        b = qrw.getBounds()

        w=b[2]-b[0] 
        h=b[3]-b[1] 

        d = Drawing(100, 100, transform=[100./w, 0, 0, 100./h, 0, 0]) 
        d.add(qrw)

        renderPDF.draw(d, p, 1, 1+z*10)
        p.drawString(100, 1 + z*10, ' '+ str(uzyt.jezyk_egzaminu)+ ' ' + str(uzyt.imie) + ' ' + str(uzyt.nazwisko) + ' '+ str(uzyt.kierunek) ) 
        p.showPage()



    p.save()
    return response

【问题讨论】:

  • 你能添加你得到的错误吗?

标签: python django python-2.7 django-views


【解决方案1】:

你所有的循环都喜欢

for i, pytanieDE in enumerate(Pytanie.objects.all()):

除了循环变量的拼写不相关外,其他都是完全相同的——在每种情况下,您都在使用 all Pytanie 对象,完全没有选择它们。

所以if/elif 可能工作得很好,但你永远不会知道,因为你对该决策树的每一节都做了完全相同的事情!-)

您的循环变量名称与之前的分配冲突:

pytanie = Pytanie.objects.all().order_by('published')
pytanieDE = PytanieDE.objects.all().order_by('published')
pytanieFR = PytanieFR.objects.all().order_by('published')

并因此覆盖它们(并重复 .objects.all() 查询)。

我想你实际上想要做的,与你上面实际展示的相反,可能是这样的:

    if uzyt.jezyk_egzaminu == 'EN':
        for i, pyt in enumerate(pytanie):
            p.drawString(10, 400 + i*210, ' '+ pyt.title)
    elif uzyt.jezyk_egzaminu == 'DE':
        for i, pytDE in enumerate(pytanieDE):
            p.drawString(10, 400 + i*210, ' '+ pytDE.title)

等等——枚举你已经准备好的查询,并使用与查询不同命名的循环变量以避免将它们清除!-)

【讨论】:

  • 当然。这太容易了 :) 我知道哪里出了问题 :) 谢谢 :)