python - 具有自定义模型初始化的 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,它允许我为每个用户存储一堆不同的标签。我正在寻找的是一种使用为给定用户过滤掉的商店字段来初始化此类表单集的方法。
这样,我的表单将选择分配给用户的商店。
任何想法都非常受欢迎!谢谢
解决方案
您可以使用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)
推荐阅读
- azure - Azure Active Directory B2C 资源所有者密码凭据流(服务器到服务器)
- java - jFrame中有多个帧?
- python - 在 MacOS 上为系统范围的 Python 安装 OpenCV
- aws-lambda - 如何将 Kinesis Video Stream 与 Kinesis Video Rekognition 集成以检测人员
- c# - 用 C# 替换空格
- python - 忽略路径字符串中的特定单词
- unity3d - Apk 文件在“构建和运行”之后去哪里?
- c# - 为什么 System.Net.Http.HttpMethod 是一个类,而不是一个结构?
- xml - 有没有一种简单的方法来表示 xsl 样式表中的引号?
- google-maps - 谷歌地图样式版本 - 即使在关闭可见性后,标签也有笔触效果