如何使此功能在Django的views.py中起作用?

时间:2019-07-11 08:25:53

标签: python html django

我想使此Destination()函数与多个变量一起使用,因为我不想一次又一次地编写它。我用两个变量使它相等,但是它不起作用。如何解决这个问题?

def index(request):
    a,b = Destination()
    a.desc = 'Hello, How are you!'
    a.img = '01.jpg'

    b.desc = 'Hello, How are you!'
    b.img = '02.jpg'

    target = [a,b]

    context = {
     'target': target
    }
    return render(request, 'index.html', context)

1 个答案:

答案 0 :(得分:4)

如果您写a, b = ...,则执行iterable unpacking [PEP-3132]。由于Destination对象可能不可迭代,因此将无法正常工作。

例如,您可以使用列表推导在此处生成两个Destination,这甚至可以跳过第二次分配target = [a, b]的需要:

def index(request):
    target = a, b = [Destination() for __ in range(2)]
    a.desc = 'Hello, How are you!'
    a.img = '01.jpg'

    b.desc = 'Hello, How are you!'
    b.img = '02.jpg'

    context = {
     'target': target
    }
    return render(request, 'index.html', context)

并假设descDestination(..)的构造函数的参数,您也可以忽略它:

def index(request):
    target = a, b = [Destination(desc='Hello, How are you!') for __ in range(2)]
    a.img = '01.jpg'
    b.img = '02.jpg'

    context = {
     'target': target
    }
    return render(request, 'index.html', context)

严格来说,您可以制作某种生成器,例如:

def generator(f, n, *args, **kwargs):
    return [f(*args, **kwargs) for __ in range(n)]

然后上述内容可以替换为:

def index(request):
    target = a, b = generator(Destination, 2, desc='Hello, How are you!')
    a.img = '01.jpg'
    b.img = '02.jpg'

    context = {
     'target': target
    }
    return render(request, 'index.html', context)

因此,这可能会稍微减少样板代码的数量,尽管它可能会使可读性降低,因为现在读者将需要首先检查generator函数。