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
中没有显示任何内容......
这有什么不对?
答案 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)中不再看到它。唯一合适的方法是转换样本,找到我们可以重写的现有函数以实现所需的结果。