隐藏但需要 OneToOneField 的 Django 创建 ModelForm
Posted
技术标签:
【中文标题】隐藏但需要 OneToOneField 的 Django 创建 ModelForm【英文标题】:Django creation ModelForm with OneToOneField hidden but required 【发布时间】:2014-09-23 02:56:16 【问题描述】:所以我有一个模型:
class MyThing(models.Model):
my_field = OneToOneField(SomeOtherModel)
... other fields
表格:
class MyThingForm(forms.ModelForm):
class Meta:
model = MyThing
一个视图:
class MyThingView(views.TemplateView):
template_name = 'thing.html'
def get(self, request, *args, **kwargs):
form = MyThingForm()
return render(self.template_name, 'form': form)
def post(self, request, *args, **kwargs):
... retrieve some_instance
request.POST['my_field'] = some_instance
form = MyThingForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(...somewhere else)
return render(self.template_name, 'form': form)
我的thing.html 模板:
% for field in form %
field
% endfor %
我的问题是:
我需要在渲染模板时隐藏 my_field 字段(但从后端),这意味着当我在 form 上执行 for 时> 在模板中,它不应该已经在字段中设置了 my_field 字段 这是一个创建表单,这意味着我没有现有的实例 在后端,my_field 是必需的,因此在执行 POST 时,我会从某处检索 my_field 的实例,无论在哪里,并将其添加到可见表单的数据中。在此之后,表单应该是有效的并且可以保存到数据库中所以基本的问题是:如何使必填字段隐藏但可保存?
【问题讨论】:
【参考方案1】:非常常见的用例请看this doc。
总而言之,您可以从表单中排除该字段并在从某处检索它后保存它。
更新代码为
class MyThingForm(forms.ModelForm):
class Meta:
model = MyThing
exclude = ['my_field', ]
class MyThingView(views.TemplateView):
...
def post(self, request, *args, **kwargs):
form = MyThingForm(request.POST)
#retrieved_my_field = retrieve the field
if form.is_valid():
inst = form.save(commit=False)
inst.my_field = retrieved_my_field
inst.save()
return HttpResponseRedirect(...somewhere else)
return render(self.template_name, 'form': form)
【讨论】:
以上是关于隐藏但需要 OneToOneField 的 Django 创建 ModelForm的主要内容,如果未能解决你的问题,请参考以下文章
Django OneToOneField、ManyToManyField、外键
在 ForeignKey 上设置 unique=True 与使用 OneToOneField 的效果相同
Django Python 3.x - 用ContentTypes覆盖OneToOneField的delete()。