Django多值字段

时间:2014-12-21 00:12:50

标签: django django-models model

我使用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实例也会被保存。

1 个答案:

答案 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),
)