我正在使用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个输出&#39;无&#39;。所以我认为在我对Django的无知和缺乏经验时,我没有正确使用模型formset工厂。
第2部分。我还想使用kwargs设置&#39;客户名称的初始值。使用kwarg&#39;客户列表&#39;在URL中传递。我使用以下内容来确认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传递到表单的初始字段中?感谢你的时间!