我使用Django 1.7并且存在以下建模问题,有两个模型和一个 在此片段中不止一次地引用另一个:
class SchoolInfo(Model):
name = ...
address = ...
class PersonInfo(Model):
elementary = OneToOneField(SchoolInfo)
colege = OneToOneField(SchoolInfo)
问题是PersonInfo
的表单显示了一个选择字段,因此您可以选择预定义的SchoolInfo
个实例,我想要的是显示SchoolInfo
个字段,因为它们是像这样的PersonInfo
(想象它是一种网络形式):
elementary info
school name: <text area> address: <text area>
colege name: <text area> address: <text area>
因此,当PersonInfo
保存到数据库时,SchoolInfo
实例也会被保存。
答案 0 :(得分:1)
你可能需要一个inline model formset,注意你有大学而不是大学
ElemFormset = inlineformset_factory(
SchoolInfo, PersonInfo,
instancefk_name="elementary",
can_delete=False, max_num=1, min_num=1)
CollegeFormset = inlineformset_factory(
SchoolInfo, PersonInfo,
fk_name="college", can_delete=False, max_num=1, min_num=1)
在可以添加新人信息的视图中使用它,或者通过在网址中提供他们的personinfo pk来编辑一个信息(注意,未经测试的代码,可能会让你的猫爆炸):
class PersonInfoForm(forms.ModelForm):
class Meta:
model = PersonInfo
fields = ('something',) # do not put here elementary or college
def manage_personinfo(request, pid=None):
p = PersonInfo.objects.filter(pk=pid)
instance = p[0] if p.exists() else None
pf_form = PersonInfoForm(request.POST or None,
request.FILES or None,
instance=instance)
ElemFormset = inlineformset_factory(
SchoolInfo, PersonInfo,
instancefk_name="elementary",
can_delete=False, max_num=1, min_num=1)
CollegeFormset = inlineformset_factory(
SchoolInfo, PersonInfo,
fk_name="college", can_delete=False, max_num=1, min_num=1)
e_formset = ElemFormset(
request.POST or None, request.FILES or None,
instance=instance, prefix="elementary")
c_formset = SchoolFormset(
request.POST or None, request.FILES or None,
instance=instance, prefix="college")
if pf_form.is_valid() and e_formset.is_valid() and c_formset.is_valid():
e_formset.save()
c_formset.save()
instance = pf_form.save()
return HttpResponseRedirect(instance.get_absolute_url())
return render_to_response("manage_personinfo.html", {
"e_form": e_formset,
"c_formset": c_formset,
"pf_formset": pf_formset,
})
并且网址如下:
urlpatterns = patterns('',
url(r'^editpinfo/(?<pid>\d+)/$', manage_personinfo),
)