如何嵌入模型&x27;在Django的另一个模型中是什么形式? 使用Basti的答案视图进行更新

如何嵌入模型&x27;在Django的另一个模型中是什么形式? 使用Basti的答案视图进行更新,django,forms,model,Django,Forms,Model,我有一个手机模型(PhoneMixin-用于任何其他型号)和个人: from django.utils.translation import ugettext_lazy as _ from django.db import models class PhoneMixin(models.Model): TYPES_CHOICES = ( ('HOME', u'Home'), ('WORK', u'Work'), ('MOBILE', u'M

我有一个手机模型(PhoneMixin-用于任何其他型号)和个人:

from django.utils.translation import ugettext_lazy as _
from django.db import models

class PhoneMixin(models.Model):
    TYPES_CHOICES = (
        ('HOME', u'Home'),
        ('WORK', u'Work'),
        ('MOBILE', u'Mobile'),
        ('HOME_FAX', u'Fax (home)'),
        ('WORK_FAX', u'Fax (work)'),
        ('PAGER', u'Pager'),
        ('OTHER', u'Other')
    )
    phone_type = models.CharField(_('Type'), max_length=20, choices=TYPES_CHOICES)
    number = models.CharField(_('Number'), max_length=40)
    comment = models.TextField(_('Comment'), blank=True, null=True)

class Person(models.Model):
    class Meta:
        verbose_name = u'Person'
        verbose_name_plural = u'People'

    name = models.CharField(max_length=255, verbose_name=u'Name')
    email = models.EmailField(max_length=75)

    def __unicode__(self):
        return self.name

class PhonePerson(PhoneMixin):
    belongs_to = models.ForeignKey(Person)
我也有他们的表格:

from django import forms
from models import Person, PhoneMixin

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person

class PhoneForm(forms.ModelForm):
    class Meta:
        model = PhoneMixin
我唯一的看法是:

from django.forms.formsets import formset_factory
from django.http import HttpResponseRedirect
from django.shortcuts import render
from forms import PhoneForm, PersonForm


def person_insert_view(request):
    PhoneFormset = formset_factory(PhoneForm)

    if request.method == 'POST':  # If the form has been submitted...
        phone_formset = PhoneFormset(request.POST, prefix='phone_formset')
        person_form = PersonForm(request.POST, prefix='person_form')
        if person_form.is_valid():  # All validation rules pass
            person = form.save(commit=False)
            phone_formset = PhoneFormset(request.POST, instance=person)
            if phone_formset.is_valid():
                phone_formset.save()
                person.save()
            return HttpResponseRedirect('/')  # Redirect after POST
        else:
            return render_to_response('function_based_person.html',{
        'person_form': person_form,
        'phone_formset': phone_formset,
    })
    else:
        person_form = PersonForm()
        phone_formset = PhoneFormset(prefix='phone_formset')

    return render(request, 'function_based_person.html', {
        'person_form': person_form,
        'phone_formset': phone_formset,
    })
以及基于函数的_person.html模板:

<html>
<body>
<form enctype="multipart/form-data" method="post" action=".">
{% csrf_token %}
{% if person_form.visible_fields %}
    {% for field in person_form.visible_fields %}
    <div class="control-group{% if field.errors %} error{% endif %}">
        <label class="control-label" for="id_{{ field.html_name }}">{{ field.label }}    </label>
        <div class="controls">
            {{ field }}
            {% if field.errors %}
            <span class="help-inline">{% for error in field.errors %}{{ error }}{% endfor %}</span>
            {% endif %}
            {% if field.help_text %}<span class="help-inline">{{ field.help_text }}</span>{% endif %}
        </div>
    </div>
    {% endfor %}

    {% for phone_form in phone_formset %}
      {{phone_form.as_table}}
    {% endfor %}
    <div class="form-actions">
        <button type="submit" class="btn btn-primary">Save</button>
    </div>
{% endif %} 
</form>
</body>
</html>

{%csrf_令牌%}
{%if person\u form.visible\u fields%}
{person_form.visible_fields%}
{{field.label}
{{field}}
{%if field.errors%}
{%for字段中的错误。错误%}{{error}{%endfor%}
{%endif%}
{%if-field.help_-text%}{{field.help_-text}}{%endif%}
{%endfor%}
{phone_formset%中phone_表单的%s}
{{phone_form.as_table}}
{%endfor%}
拯救
{%endif%}

问题是,我希望自己至少有一部手机,并且如果用户想添加手机,我可以拥有两部或更多。ForeignKey只是指向另一个表中特定行的指针。您的
Person
模型所说的是“每个人都有一个或两个电话。每个电话都存储在另一个名为“Phone”的表中。” 因此,除非您正在做一些复杂的事情,否则您的
Person
表单会要求您为您的新人关联两部现有手机

(编辑以回应您的评论)。
如果你想拥有多部手机,那么你需要的是一部手机

您需要做的第一件事是更改表指向的位置:手机应该指向一个人,而不是指向手机的人。例如,在手机型号声明中添加
atto\u to=models.ForeignKey(Person)

下一步是在你的视野中询问手机。这就是表单集的作用。在视图中,创建一个表单集:

#in views.py
from django.forms.formsets import formset_factory
PhoneFormset = formset_factory(PhoneForm, extras = 1)

if request.method == 'POST':
    phone_formset = PhoneFormset(request.POST, prefix = 'phone_formset')
    person_form = PersonForm(request.POST, prefix='person_form')
    # validate your forms, etc
else:
    person_form = PersonForm()
    phone_formset = PhoneFormset(prefix = 'phone_formset')
phone\u formset
添加到传递到模板的字典中,结束后按如下方式渲染:

# in your template
<form>
{{person_form.as_p}}
{% for phone_form in phone_formset %}
  {{phone_form.as_table}}
{% endfor %}
</form>
模板中的
#
{{person_form.as_p}}
{phone_formset%中phone_表单的%s}
{{phone_form.as_table}}
{%endfor%}

您最不需要做的就是将每部手机的
归属
字段设置为提交表单的人。您必须在您的视图中执行此操作:可能在保存手机之前先保存您的人,获取他们的pk,设置手机的外键,然后保存

ForeignKey只是指向另一个表中特定行的指针。您的
Person
模型所说的是“每个人都有一个或两个电话。每个电话都存储在另一个名为“Phone”的表中。” 因此,除非您正在做一些复杂的事情,否则您的
Person
表单会要求您为您的新人关联两部现有手机

(编辑以回应您的评论)。
如果你想拥有多部手机,那么你需要的是一部手机

您需要做的第一件事是更改表指向的位置:手机应该指向一个人,而不是指向手机的人。例如,在手机型号声明中添加
atto\u to=models.ForeignKey(Person)

下一步是在你的视野中询问手机。这就是表单集的作用。在视图中,创建一个表单集:

#in views.py
from django.forms.formsets import formset_factory
PhoneFormset = formset_factory(PhoneForm, extras = 1)

if request.method == 'POST':
    phone_formset = PhoneFormset(request.POST, prefix = 'phone_formset')
    person_form = PersonForm(request.POST, prefix='person_form')
    # validate your forms, etc
else:
    person_form = PersonForm()
    phone_formset = PhoneFormset(prefix = 'phone_formset')
phone\u formset
添加到传递到模板的字典中,结束后按如下方式渲染:

# in your template
<form>
{{person_form.as_p}}
{% for phone_form in phone_formset %}
  {{phone_form.as_table}}
{% endfor %}
</form>
模板中的
#
{{person_form.as_p}}
{phone_formset%中phone_表单的%s}
{{phone_form.as_table}}
{%endfor%}

您最不需要做的就是将每部手机的
归属
字段设置为提交表单的人。您必须在您的视图中执行此操作:可能在保存手机之前先保存您的人,获取他们的pk,设置手机的外键,然后保存

你能给我们看一下你的
Person
表单的代码吗?你能给我们看一下你的视图代码和模板代码吗?我不知道我有一个表单。。我更新了我的代码。你能给我们看一下你的
人名
表单的代码吗?你能给我们看一下你的视图代码和模板代码吗?我找不到我有一个表单。。我更新了我的代码。更正巴斯蒂!我不想用外键。它更像是一个电话列表。手机在另一个表中没有问题,我不想指定一个人拥有的最大手机数量。我只是不知道如何做…编辑以更好地解决您的问题。抱歉,我不理解此部分。。是否使用基于函数的视图?我使用的是通用视图。为了更清楚,我还编辑了我的问题。谢谢我认为您不应该使用通用视图。我建议你使用一个类似文档中的视图:干得好。我假设你所说的“我希望至少有一个”是指你希望你的用户看到一个带有一个手机表单的页面,并且能够更动态地添加?如果是这种情况,那么没有简单的预构建方法来实现这一点。大多数人会编写一些javascript来动态添加表单,如下所示:。我还发现了一个关于如何在没有javascript的情况下做到这一点的示例:Correct Basti!我不想用外键。它更像是一个电话列表。手机在另一个表中没有问题,我不想指定一个人拥有的最大手机数量。我只是不知道如何做…编辑以更好地解决您的问题。抱歉,我不理解此部分。。是否使用基于函数的视图?我使用的是通用视图。为了更清楚,我还编辑了我的问题。谢谢我认为您不应该使用通用视图。我建议你使用一个类似文档中的视图:干得好。我假设你所说的“我希望至少有一个”是指你希望你的用户看到一个带有一个手机表单的页面,并且能够更动态地添加?如果是这种情况,那么没有简单的预构建方法来实现这一点。大多数人会编写一些javascript来动态添加表单,如下所示:。我还发现了一个关于如何在没有javascript的情况下完成此操作的示例: