python - Django - 试图将模型字段的实例传递给表单字段
问题描述
我会尽我最大的努力不要听起来像一个真正的傻瓜,但没有承诺。我是一名护理人员,我正在尝试制作一个应用程序来以电子方式记录单元检查。我有一个模型字段,该字段与我的项目中的其他几个模型外键。此字段指定用户当天配备的单位。我希望用户选择他/她当天配备的单位,并让该信息自动填写为该会话填写的任何表格。我尝试使用会话存储对象,我得到这个“'MedicUnit' 类型的对象不是 JSON 可序列化的”。我使用了 model_to_dict 方法并尝试通过 form_valid 方法传递单位名称的字符串,但我得到这个“无法分配“'Medic 2'”:“DailyCheck.medic_unit_number”必须是“MedicUnit”实例。” 我对编程和 Django 比较陌生,这似乎是一个很容易解决的问题,但我的谷歌搜索技能并没有让我到任何地方。这是我的代码:
Model.py 为 unit_name 模型字段的来源
class MedicUnit(models.Model):
unit_name = models.CharField(max_length=50, default='')
is_active = models.BooleanField(default=True)
def __str__(self):
return self.unit_name
Model.py 用于对 unit_name 的外键引用之一
class DailyCheck(models.Model):
daily_user = models.ForeignKey(User, on_delete=models.PROTECT)
record_date = models.DateTimeField(auto_now=True)
medic_unit_number = models.ForeignKey('components.MedicUnit', related_name='medic_unit_number', on_delete=models.PROTECT, default='')
unit_property_number = models.ForeignKey('components.Vehicle', related_name='unit_property_number', on_delete=models.PROTECT, default='')
mileage = models.IntegerField(default=0)
narc_seal_number = models.IntegerField(default=0)
emergency_lights = models.BooleanField()
driving_lights = models.BooleanField()
red_bag = models.BooleanField()
LP_15 = models.BooleanField()
BLS_bag = models.BooleanField()
RTF_bag = models.BooleanField()
suction = models.BooleanField()
oxygen = models.BooleanField()
free_text = models.TextField(default='')
views.py 用于直接上面的模型
def check_home_view(request):
if request.method == 'POST':
form = ChooseMedicUnit(request.POST or None)
if form.is_valid():
unit_name = form.cleaned_data.get('medic_unit_number')
request.session['unit_name'] = model_to_dict(unit_name)
print(request.session['unit_name'])
return redirect('daily')
else:
form = ChooseMedicUnit()
return render(request, 'checks/checks_home.html', {'form':form})
class checkAdd(CreateView):
model = DailyCheck
fields = ['unit_property_number', 'mileage', 'narc_seal_number', 'emergency_lights', 'driving_lights', 'red_bag', 'LP_15', 'BLS_bag', 'RTF_bag', 'suction', 'oxygen', 'free_text']
success_url = '/checks'
def form_valid(self, form):
form.instance.daily_user = self.request.user
form.instance.medic_unit_number = self.request.session['unit_name']['unit_name']
return super().form_valid(form)
表格.py
class ChooseMedicUnit(forms.ModelForm):
class Meta:
model = DailyCheck
fields = ['medic_unit_number']
解决方案
我认为您可以使用 MedicUnit.id。这应该足以解决以其他形式从会话中初始化字段的问题:
def check_home_view(request):
if request.method == 'POST':
form = ChooseMedicUnit(request.POST or None)
if form.is_valid():
request.session['unit_name'] = form.cleaned_data.get('medic_unit_number').id # see here
print(request.session['unit_name'])
return redirect('daily')
else:
form = ChooseMedicUnit()
return render(request, 'checks/checks_home.html', {'form':form})
推荐阅读
- pyspark - Delta 合并逻辑 whenMatchedDelete 案例
- google-apps-script - 试图编写一个宏来仅在谷歌表中粘贴值
- java - 安装 analysis-icu、zenity 和 analysis-phonetic 时出现 Elasticsearch 插件错误
- dynamic-programming - 在 CPLEX 中解决此二次问题的另一种方法是什么?
- visual-studio-code - 如何在 VS 代码编辑器中将每个文件允许的最大行数限制设置为 5000 行
- flutter - 为什么即使我修改了android文件夹中的launch_background.xml也不适用?
- amazon-web-services - DynamoDB 错误:成员的长度必须小于或等于 2;成员必须满足枚举值集:[HASH, RANGE]
- python-3.x - 如何使用 OpenCV 查找图像中三角形的方向
- javascript - mark.js - 使准确性参数成为一个函数
- dns - 如何找到DNS流量的源头进程?