如何嵌入模型&x27;在Django的另一个模型中是什么形式? 使用Basti的答案视图进行更新
我有一个手机模型(PhoneMixin-用于任何其他型号)和个人:如何嵌入模型&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
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的情况下完成此操作的示例: