首页 > 解决方案 > 具有基于外键的字段的 Django 表单

问题描述

我正在开发一个添加模型新实例的 Django 表单。Model 本身有一个 ForeignKey 实例。假设我想记录每个工人的所有工作班次。

我的模型:

class WorkShifts(models.Model):

    date = models.DateField()
    check_in = models.TimeField()
    check_out = models.TimeField()
    person_name = models.ForeignKey(Worker, on_delete=models.DO_NOTHING)

这是我的表格:

class AddWorkShifts(forms.ModelForm):

    date = forms.DateField(initial=datetime.date.today, input_formats=['%d/%m/%Y'])
    check_in = forms.TimeField()
    check_out = forms.TimeField()

    class Meta:
        model = WorkShifts
        fields = '__all__'

    def __init__(self, *args, **kwargs):

        super(AddWorkShifts, self).__init__(*args, **kwargs)

        self.fields['date'].widget.attrs['class'] = 'form-control'
        self.fields['check_in'].widget.attrs['class'] = 'form-control'
        self.fields['check_out'].widget.attrs['class'] = 'form-control'
        self.fields['person_name'].widget.attrs['class'] = 'form-control'

我的 HTML 代码:

    <form method="POST">
    {% csrf_token %}


      {{ form.date }}<br />
      {{ form.check_in }}<br />
      {{ form.check_out }}<br />
      {{ form.person_name }}

      <button type="submit">Load</button>

  </form>

而我的观点:

def load_shifts(request):
    form = AddWorkShifts()
    if request.method == 'POST':
        form = AddWorkShifts(request.POST)
        if form.is_valid:
            form.save()
    context = {'form': form}
    return render(request, 'users/wshifts.html', context)

在这一点上,一切正常。请注意 form.is_valid 没有 () 符号。

但是由于我有这么多人(外键),我配置了一个 JS 自动完成插件(EaseAutoComplete)并重新设计了这样的表单:

      <form align="center" method="POST">

        {% csrf_token %}

        <input type="text" class="p_name" id="provider-file" />

          {{ form.date }}<br />
          {{ form.check_in }}<br />
          {{ form.check_out }}<br />

          <button type="submit">Agregar</button>

      </form>

自动完成建议取自 json 列表。但是虽然自动完成功能工作正常,但现在我无法创建新实例。

我做错了什么?

标签: djangodjango-modelsdjango-forms

解决方案


您的表格未发送person_name,这是表格要求的。您需要使用name输入字段中的属性为表单提供值。

<input type="text" class="p_name" id="provider-file" name="person_name" />


推荐阅读