需求:商品需要多选关联推荐商品
商品详情页
1.models.py
class Product(models.Model):
"""
商品
"""
name = models.CharField(max_length=30, verbose_name='商品名称')
product_category = models.ForeignKey(ProductCategory, verbose_name='商品分类', on_delete=models.CASCADE)
related_product = models.ManyToManyField('self', verbose_name='关联推荐商品',
null=True, blank=True, symmetrical=False)
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
商品类related_produce字段设计成ManyToManyField,并指向自己。
symmetrical=False为当多对多关系对应自己时,建立关系时不需要迭代插入。
例:
symmetrical=True:商品1关联了商品2,则商品2也关联了商品1
symmetrical=False:商品1关联了商品2,商品2不关联商品1
这里由于为关联推荐商品,故设置其为Flase。
2.adminx.py
class ProductAdmin(object):
# form = ProductForm
style_fields = {'related_product': 'm2m_transfer'}
m2m_dropdown设置后报错,不知道什么原因。
xadmin多选插件
研究xadmin,发现Group或者User选择权限的时候有类似用法,于是参照设置,运行成功。
3.多选样式
forms中提供了几种多选的方式
class ProductForm(forms.ModelForm):
"""
form追加多选框示意
"""
# model = Product
# related_product = forms.ModelMultipleChoiceField(label=u'关联商品', queryset=Product.objects.all(),
# widget=forms.CheckboxSelectMultiple())
#
# related_product = forms.CheckboxSelectMultiple()
# fields = ['name', 'related_product']
pass
class ProductAdmin(object):
# form = ProductForm
style_fields = {'related_product': 'm2m_transfer'}
指定model
1)forms.CheckboxSelectMultiple()即可加载指定model的复选框。
2)forms.ModelMultipleChoiceField()可以指定queryset,不过貌似存在库里面的是queryset对象。
上述两种样式也不太一样。