【问题标题】:Django invalid form when using modelchoicefield使用modelchoicefield时Django无效的形式
【发布时间】:2016-11-08 13:54:43
【问题描述】:

我是 Django 新手,我一直在努力在我的观点中获得 forms.ModelChoiceField 的选定值。我的表单(帖子)无效,我注意到 request.POST 返回了 ModelChoiceField 中的所有可能值。如何仅获取用户选择的模型?提前感谢您的帮助。

型号

我有一个传感器模型和一个测量模型...

class Sensor(models.Model):
    # This contains information about a sensor, type, location, and other
    type = models.CharField(max_length=16)
    ...

class Measurement(models.Model):
    #This contains the measurements of the sensors at a given date
    sensor = models.ForeignKey('Sensor')
    date = models.DateField()
    temperature = models.FloatField()
    pressure = models.FloatField()
    ...
    class Meta:
        unique_together = ('sensor', 'date')

表格

...以及允许用户选择传感器和日期的表单:

class MeasurementForm(forms.ModelForm):
    #the user is allowed to choose any sensor that is related to the measurement table
    sensor = forms.ModelChoiceField(queryset=Sensor.objects.exclude(measurement=None))
    date =  forms.DateField(widget=DateInput(attrs={'format':'%Y-%m-%d'}), initial=datetime.today)

到目前为止一切顺利,这由 get 方法呈现,用户可以选择传感器和日期。但是,提交后,以下视图在帖子中失败:

观看次数

class MeasurementView(View):
    form_class = MeasurementForm
    my_template = "measurement.html"

    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.my_template, {'form': form, 'data':None})

    def post(self, request, *args, **kwargs):
        print(request.POST)
        print(new_form.errors)
        new_form = self.form_class(data=request.POST)
        if new_form.is_valid():
            print('form is valid')
            data = get_data_for_sensor_date(
                        new_form.cleaned_data['sensor'],
                        new_form.cleaned_data['date']))
            return render(request, self.my_template, {'form':new_form, 'data':data})
        else:
            return render(request, self.my_template, {'form':new_form, 'data':None})

控制台输出

<QueryDict: {'sensor': ['', '1'], 
             'csrfmiddlewaretoken': ['YUPfrdhdbQdAa7EyNx2sJeHdbxmQXTTW'], 
             'date': ['2016-11-07']}>

<ul class="errorlist">
  <li>__all__
    <ul class="errorlist nonfield">
      <li>Measurement with this Sensor and Date already exists.
      </li>
    </ul>
  </li>
</ul>

【问题讨论】:

  • 谢谢。编辑代码到现在
  • 如何在模板中显示表单?在post 方法中打印request.POSTnew_form.errors 可能有助于解释发生了什么。
  • 已更新问题以添加打印结果。我没有收到错误消息。我知道它们的存在,而这正是我所需要的。

标签: django forms


【解决方案1】:

我找到了这个链接Django formview returns object already exists error with a modelform

我引用的内容: “好的。我找到了我的错误的解决方案。导致模型已存在错误的原因是我的 ModelForm CheckProductForm。代号属性是唯一的,所以我的验证总是返回 False。我所做的就是将我的原始 ModelForm 更改为表单。这解决了我的整个问题。对于 form_valid 问题中的 form_invalid。如果产品不存在,我已经覆盖了表单的 clean_codename 函数以引发 ValidationError。"

我仍然不明白为什么我首先会出现错误。但是,将表单更改为下面的代码就成功了。

表格

class MeasurementForm(forms.Form):
    #the user is allowed to choose any sensor that is related to the measurement table
    sensor = forms.ModelChoiceField(queryset=Sensor.objects.exclude(measurement=None))
    date =  forms.DateField(widget=DateInput(attrs={'format':'%Y-%m-%d'}), initial=datetime.today)

【讨论】:

  • 您的模型有unique_together = ('sensor', 'date')。这意味着您每天只能对每个传感器进行一次测量。当您使用模型表单而不设置 instance 时,Django 会验证唯一约束以防止您创建重复测量。由于您已经在数据库中对该日期和传感器进行了测量,因此该表单无效并且您会收到错误消息。由于您已切换到常规表单,因此不再检查 unique_together 约束,因此表单有效。
  • 谢谢阿拉斯代尔。每天进行一次测量是我的模型的正确行为。我不知道 Django 会自动对模型中的表单执行检查,但它确实有意义。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 2014-10-11
  • 1970-01-01
  • 2014-11-15
  • 2015-08-06
  • 2013-09-15
  • 2014-04-29
相关资源
最近更新 更多