Django 1.11用于创建模型

时间:2018-02-26 03:14:10

标签: django django-models django-forms

我正在使用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>

表单在页面上显示如下: enter image description here

我所遇到的问题以及我在解决问题方面寻求帮助的问题有两部分:

第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传递到表单的初始字段中?感谢你的时间!

0 个答案:

没有答案