django xadmin 指向自己的多选关联推荐

需求:商品需要多选关联推荐商品


商品详情页

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对象。
上述两种样式也不太一样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。