如何调用表单的render_option()。在Django中选择?

时间:2016-09-30 07:38:29

标签: 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中没有显示任何内容......

这有什么不对?

1 个答案:

答案 0 :(得分:0)

问题是错误的。自定义窗口小部件时,您需要覆盖适当的功能。然后,该框架将在适当的时候为您调用它,但是您不必显式地调用它们。

发生的事情是,您遇到了一个代码示例(该示例在我的情况下可能是继承的),该示例旨在与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)中不再看到它。唯一合适的方法是转换样本,找到我们可以重写的现有函数以实现所需的结果。