使用不在模型中的字段扩展 django 表单,导致错误,只能连接列表,而不是元组

Posted

技术标签:

【中文标题】使用不在模型中的字段扩展 django 表单,导致错误,只能连接列表,而不是元组【英文标题】:Extending django form with fields not in model, results in error that only lists can be concatenated, not tuples 【发布时间】:2019-08-02 01:41:22 【问题描述】:

我正在完成一个电子商务应用程序,最后阶段是实施订单并使用条带处理付款。

我想向用户展示一个表单,他们可以在其中输入客户详细信息以及卡详细信息(卡号、到期日期和 cvv),这些信息将发送到 Stripe,但不会存储在本地。因此,在我用于表单的模型中没有与存储卡号相关的字段。

在寻找我的问题的答案时,我来到across这个问题和答案,这似乎是解决方案。

但是,当我尝试以相同的方式扩展我的表单时,我得到一个错误:

fields = OrderForm.Meta.fields + ('card_num', 'exp_month', 'exp_year', 'cvc')
TypeError: can only concatenate list (not "tuple") to list

据我所知,我正在做与该问题的答案中提出的完全相同的事情,所以我不确定为什么会收到此错误。

我正在扩展的 forms.py:

class OrderForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['first_name', 'last_name', 'email',
        'address', 'zipcode', 'city', 'state']

我尝试在我的 views.py 中扩展表单:

class OrderPayForm(OrderForm):

    card_num = forms.CharField(max_length=16)
    exp_month = forms.CharField(max_length=2)
    exp_year = forms.CharField(max_length=4)
    cvc = forms.CharField(max_length=3)

    class Meta(OrderForm.Meta):
        fields = OrderForm.Meta.fields + ('card_num', 'exp_month', 'exp_year', 'cvc')

在我正在做的事情与我正在遵循的已接受答案中的内容不同的地方,我是否遗漏了什么?

【问题讨论】:

【参考方案1】:

该错误准确地告诉您出了什么问题。使用列表而不是元组:

fields = OrderForm.Meta.fields + ['card_num', 'exp_month', 'exp_year', 'cvc']

【讨论】:

天哪……事后看来如此明显。在决定发布之前,我查看了很多次,但我看不到它。好的,谢谢! 我实际上更愿意删除这个问题,因为我认为它不会为网站增加价值,但你必须删除你的答案才能这样做。如果您同意,请告诉我,否则,谢谢您的回答。 我不熟悉这类事情的网站政策。您能否向我指出一些文档,以澄清何时应该或不应该删除问题? 这取决于你是否愿意,AFAIK 对这类事情没有既定的政策。

以上是关于使用不在模型中的字段扩展 django 表单,导致错误,只能连接列表,而不是元组的主要内容,如果未能解决你的问题,请参考以下文章

将不在模型中的字段添加到 Django REST 框架中的序列化程序

模型表单中的 Django 必填字段

具有来自两个不同模型的字段的 Django 表单

在 Django 中,为啥模型中的 blank=True 不会使表单字段不是强制性的?

有条件地只需要 Django 模型表单中的一个字段

从 Django 中的文本字段填充管理表单