【问题标题】:Django modelformset with customized model initialization具有自定义模型初始化的 Django modelformset
【发布时间】:2020-10-11 16:10:51
【问题描述】:

我在 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,它允许我为每个用户存储一堆不同的标签。我正在寻找一种方法来初始化这样的表单集,其中包含为给定用户过滤掉的商店字段。

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

非常欢迎任何想法! 谢谢

【问题讨论】:

  • 你能说得更具体点吗?您是否想要一个表单集,当给定用户时,每个表单都是名称和商店输入,其中商店输入被过滤?也许你的模型会有所帮助。
  • 你是对的。这对我来说有点难以解释,所以我编辑了我的帖子。谢谢

标签: python django django-forms modelform formset


【解决方案1】:

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

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)

【讨论】:

  • 太棒了!我还是 django formset 的新手,不知道 inlineformset_factory。你的回答肯定有帮助。干杯!
猜你喜欢
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多