具有自定义模型初始化的 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
为相关模型创建一个表单集。要为您的 tag
和 user
模型创建一个表单集,您可以执行以下操作:
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)
我在 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
为相关模型创建一个表单集。要为您的 tag
和 user
模型创建一个表单集,您可以执行以下操作:
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)