我正在使用Django 1.11作为我的第一个Django / Python项目,并且为了创建一个允许通过一个表单创建多个模型实例的表单,我们已经停留了几天试图理解Formsets . 我们将非常感谢您提供的帮助我理解并解决此问题的任何帮助!
我接近它的方式如下:
我有以下型号:
class Task(models.Model):
client_name = models.ForeignKey(Client,null=True,blank=True,on_delete=models.DO_NOTHING)
description = models.CharField(max_length=255)
due_date = models.DateField(null=True,blank=True,default=datetime.now)
assigned = models.ForeignKey(User,on_delete=models.DO_NOTHING)
我有以下基于该模型的表格:
class FNTaskForm(ModelForm):
class Meta:
model = Task
exclude = ()
我已经基于上面的模型和形式创建了以下FormSet:
TaskFormSet = modelformset_factory(Task, form = FNTaskForm, exclude=(),extra=2)
在views.py我有:
class FNTaskCreate(CreateView):
model = Task
form_class = FNTaskForm
template_name = 'fntasks.html'
def get_context_data(self, **kwargs):
context = super(FNTaskCreate, self).get_context_data(**kwargs)
context['formset'] = TaskFormSet(queryset=Task.objects.none()) # providing none
return context
最后我在我的html模板中渲染它:
<form method="post">
{% csrf_token %}
<table class="table link-formset">
{% for form in formset %}
{% if forloop.first %}
<thead>
<tr>
{% for field in form.visible_fields %}
<th>{{ field.label }}</th>
{% endfor %}
</tr>
</thead>
{% endif %}
<tr class="{% cycle row1 row2 %} formset_row">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
<a class="btn btn-default" href="{% url 'clients' %}">Cancel</a>
<input type="submit" value="Next" class="btn btn-primary" />
</form>
该表单在页面上显示如下:
我所拥有的问题以及我在解决问题上感谢的问题包括两部分:
第1部分 . 我无法使用此表单将数据成功保存到模型中 . 我没有得到任何错误,但我相信表单有3个实例,而不仅仅是显示的2个实例,它是第三个(不可见的实例)是空白的,因此不允许表单有效 . 我认为这与第2期(下文)有关 . 当我插入print我的kwargs.pop变量来测试它时,我得到3个输出'None' . 所以我认为,由于我对Django的无知和缺乏经验,我没有正确使用模型formset工厂 .
第2部分 . 我还想使用kwargs使用URL中传递的kwarg'clientlist'来设置'Client Name'字段的初始值 . 我使用以下内容来确认kwarg,但结果是(None None None):
def __init__(self, *args, **kwargs):
clientlist = kwargs.pop('clientlist', None)
super().__init__(*args, **kwargs)
print(clientlist)
传递kwarg的URL如下:
url(r'^tasks/create/(?P<clientlist>\d+)/$',views.FNTaskCreate.as_view(),name='fntask_create'),
是否有人能够帮助我传递这些问题以使用modelformset_factory(或任何其他更好的推荐方法)来成功保存多个模型实例,其中一个表单将kwargs传递到表单的初始字段中?感谢你的时间!