将外键从用户输入传递到数据库

时间:2019-08-29 18:19:08

标签: python django

我试图让用户输入数据并存储到DB中并与其他数据映射。

型号:

class Code(models.Model):
  name = models.CharField(max_length=4, default=None, blank=True, unique=True)

在模型内,还有另一个类

class Pull(models.Model):
  code_pull = models.ForeignKey(Code, on_delete=models.SET_NULL, null=True)

如何显示在窗体和视图中以进行调用,以便在用户在输入字段中输入数据时传递数据。

表格

class Code_Form(forms.ModelForm):
    class Meta:
        model = Code
        fields = ('name',)

class Pull_Form(forms.ModelForm):
    class Meta:
        model = Pull
        fields = ('code_pull', 'data1', 'prefix',)
        #Inital Value is NULL
    def __init__(self, *args, **kwargs):
        super(Pull_Form, self).__init__(*args, **kwargs)
        self.fields['code_pull'].queryset = CODE.objects.none()
        if 'code_pull' in self.data:
            c = self.data.get('code_pull')
            self.fields['code_pull'].queryset = CODE.objects.filter(name=c)
            #print(self.fields['code_pull'].queryset)


我更新了FORM的代码,因此由于代码字段为空,因此它从CODE_form(仍然错误)中初始化了值

这是视图:

def InputData(request, *args, **kwargs):
   form = Pull_Form(request.POST or None)
      if request.method == 'POST':
         if form.is_valid():
            data_add = form.save(commit=False)
            data_add.code = form.cleaned_data['code_pull']
            data_add.save()
            messages.success(request, 'Successfully')
        else:
            messages.error(request, form.errors)
    return render(request, template_name, {'form': form })

错误:由于提交表单时未选择code的字段,因此无法添加数据。 错误代码:code - Select a valid choice. That choice is not one of the available choices.

{{ messages }}
<form id="form1" class="post-form" role=form method="POST" action=".">{% csrf_token %}
<input id="code_pull" class="form-control" type="text" maxlength="4" required></input>
<label for="code_pull">Code</label>
<button type="submit" class="btn">Save</button>
</form>

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

Django表单使用HTML控件中的name属性来捕获表单数据。

<input id="code" name="code" class="form-control" type="text" maxlength="4" required></input>

我只添加了name="code"。这应该使它工作。