【发布时间】: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.POST和new_form.errors可能有助于解释发生了什么。 -
已更新问题以添加打印结果。我没有收到错误消息。我知道它们的存在,而这正是我所需要的。