具有自定义模型初始化的 Django modelformset

Django modelformset with customized model initialization

我在 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()
    ...

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

这样我的表单就会有一系列分配给用户的商店。

非常欢迎任何想法! 谢谢

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

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

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

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

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

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)