django - 如何在 Django 中调用 forms.Select 的 render_option()?

标签 django django-forms

class MySelect(forms.Select):
    def __init__(self, *args, **kwargs):
        self.variations = kwargs.pop('variations')
        super(MySelect, self).__init__(*args, **kwargs)

    def render_option(self, selected_choices, option_value, option_label):
        return '<option whatever> {} </option>'.format(self.variations[0])

class CartItemForm(forms.ModelForm):

    class Meta:
        model = CartItem
        fields = (
            'variation',
            'width',
            'height',
            'quantity',
        )


    def __init__(self, *args, **kwargs):
        product = kwargs.pop('product')
        try:
            cart = kwargs.pop('cart')
            self.cart = cart
        except:
            pass

        super().__init__(*args, **kwargs)    

        variation_field = self.fields['variation']
        variation_field.queryset = Variation.objects.filter(
            product=product
        )
        variation_field.widget = MySelect(variations=variation_field.queryset)

    def save(self):
        cart_item = super().save(commit=False)
        cart_item.cart = self.cart
        cart_item.save()

        return cart_item

但是它没有调用 render_option() 所以它没有在 template 中显示任何东西...

这有什么问题吗?

最佳答案

这个问题有问题。当您自定义一个 Widget 时,您需要覆盖适当的功能。然后框架会在适当的时候为您调用它,但您永远不必显式调用它们。

发生的事情是您遇到了(可能是继承的,就像我的情况一样)一个代码示例,它可以与 Django 的早期版本一起使用。在那些早期版本中,render_option 是正确的函数,但就我而言,我在 Django 1.11 ( https://docs.djangoproject.com/en/2.1/releases/1.11/#changes-due-to-the-introduction-of-template-based-widget-rendering ) 中再也看不到它了。唯一正确的做法是转换样本,找到我们可以覆盖的现有函数以达到预期的结果。

关于django - 如何在 Django 中调用 forms.Select 的 render_option()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39786148/

相关文章:

python - 从 Django Queryset 获取值列表的最有效方法

django - 如何在 Django 的单元测试驱动程序中测试表单的验证逻辑?

python - Django 的序列数据库?

python - 如何将从一个表模型中获取的 HTML 表数据中的记录添加到另一个表模型中?

python - 如何将 m2m 现场 session 从一个表单保存到另一个表单?

python - 具有相同字段的 Django 用户模型

python - 如何配置 Django 在 MSSQL Server 上运行

python - 如何在 Django Rest Framework 中使用手机号码登录。

python - Django 表单 is_valid() 缺少 1 个必需的位置参数 : 'self'

python - Django:如何根据表单的非持久字段自定义保存模型/表单?