【问题标题】:How can I call render_option() of forms.Select in Django?如何在 Django 中调用 forms.Select 的 render_option()?
【发布时间】:2016-09-30 07:38:28
【问题描述】:
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 中显示任何内容...

这有什么问题?

【问题讨论】:

标签: django django-forms


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2020-01-25
    • 2020-03-26
    • 1970-01-01
    相关资源
    最近更新 更多