首页 > 解决方案 > 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']

标签: pythondjango

解决方案


我认为您可以使用 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})

推荐阅读