首页 > 解决方案 > 具有自定义模型初始化的 Django modelformset

问题描述

我在 Django 中有以下模型:

class tag(models.Model):
    ...
    user = models.ForeignKey(user)
    shop = models.ForeignKey(shop)
    name = models.CharField()
    ...

class user(models.Model):
    ...
    name = models.CharField()
    ...

class shop(models.Model):
    ...
    user = models.ForeignKey(user)
    name = models.CharField()
    ...

现在我需要创建一个标签模型的modelformset,它允许我为每个用户存储一堆不同的标签。我正在寻找的是一种使用为给定用户过滤掉的商店字段来初始化此类表单集的方法。

这样,我的表单将选择分配给用户的商店。

任何想法都非常受欢迎!谢谢

标签: pythondjangodjango-formsmodelformformset

解决方案


您可以使用inlineformset_factory为相关模型创建表单集。tag要为您的模型创建表单集,user您可以执行以下操作:

tag_formset = inlineformset_factory(user, tag, fields=['shop', 'name'])
formset = tag_formset(instance=request.user)

要过滤shop字段的查询集,您可以动态创建表单或传递formfield_callback给工厂函数。

如果您使用formfield_callback,此回调可用于为您的表单返回一个自定义字段

def cb(field, **kwargs):
    if field.name == 'shop':
        kwargs['queryset'] = shop.objects.filter(user=request.user)
    return field.formfield(**kwargs)

tag_formset = inlineformset_factory(user, tag, fields=['shop', 'name'], formfield_callback=cb)
formset = tag_formset(instance=request.user)

或者您可以在视图中动态定义表单类

class TagForm(forms.ModelForm):
    shop = forms.ModelChoiceField(shop.objects.filter(user=request.user))
    class Meta:
        fields = ['shop', 'name']

tag_formset = forms.inlineformset_factory(user, tag, form=TagForm)
formset = tag_formset(instance=request.user)

推荐阅读