【问题标题】:Django: Save foreign key value in a forms raise an errorDjango:在表单中保存外键值会引发错误
【发布时间】:2014-10-23 13:22:28
【问题描述】:

我必须与外键关联的表。

具有主键 patient_id(必需)和具有外键患者的诊断的人口统计表。我创建了两个表格。我将字段保存在第一个表单上,然后在诊断表单中自动完成患者字段。

问题是,当我尝试在诊断表单上保存字段的值时,我在第一个表单上收到错误消息,显示“此字段是必需的”,即使该字段的值在一分钟前存储。

已编辑:这是我的解决方案

input.html(模板)

<form class="form-horizontal" method="post">
    {% csrf_token %}
    <div class="tabbable">
        <ul class="nav nav-tabs">
            <li class="active">
                <a href="#1" data-toggle="tab">Demographics</a>
            </li>
            <li>
                <a href="#2" data-toggle="tab">Diagnosis</a>
            </li>
            <li>
                <a href="#3" data-toggle="tab">A_b_sickle</a>
            </li>
        </ul>
        <div class="tab-content">
            <div class="tab-pane fade in active" id="1">
                <input type="hidden" name="form_id" value="demographics">
                <p>{%crispy frm%}</p>

            </div>
            <div class="tab-pane fade" id="2">
                <!-- form controls to be continued here -->
                <input type="hidden" name="form_id" value="diagnosis">
                {%crispy frm_d%}
                <p>Howdy, I'm in Section 2.</p>
            </div>
            <div class="tab-pane fade" id="3">
                <!-- form controls to be continued here -->
                <input type="hidden" name="form_id" value="a_b_s">
                {%crispy frm_a_b_s%}
                <p>Howdy, I'm in Section 3.</p>
            </div>
        </div>
    </div>
    <!--<input type="submit" name='submit' value="Submit">-->
</form>

我的 view.py 包含:

def input(request):

    if request.method == 'POST':
    my_demographics = DemographicForm(request.POST, prefix="demo")
    my_diagnosis = DiagnosisForm(request.POST, prefix='diag')
    my_a_b_sickle= A_b_sickle_thalForm(request.POST,prefix='a_b_s')

    if my_demographics.is_valid() and my_diagnosis.is_valid() and my_a_b_sickle.is_valid:
        my_demographics_object = my_demographics.save()
        my_diagnosis_object = my_diagnosis.save(commit=False)
        my_diagnosis_object.patient = my_demographics_object
        my_diagnosis_object.save()

        my_a_b_sickle_object = my_a_b_sickle.save(commit=False)
        my_a_b_sickle_object.patient = my_demographics_object

        my_a_b_sickle_object.save()

    else:
    my_demographics = DemographicForm(prefix='demo')
    my_diagnosis = DiagnosisForm(prefix='diag')
    my_a_b_sickle= A_b_sickle_thalForm(prefix='a_b_s')

return render_to_response('input.html', {'frm':my_demographics, 'frm_d': my_diagnosis, 'frm_a_b_s': my_a_b_sickle}, context)

models.py

class demographic(models.Model):
    national_health_care_pat_id = models.IntegerField('National Health Care patient id', null=True,blank=True)
    patient_hospital_file_number = models.IntegerField(null=True,blank=True)
    patient_id = models.IntegerField(unique= True ,primary_key=True)

    def __str__(self):
        return str(self.patient_id)

class diagnosis(models.Model):
    patient = models.ForeignKey(demographic)
    age_of_diagnosis = models.IntegerField(null=True,blank=True)

    def __str__(self):
        return str(self.patient_id)

forms.py

class DemographicForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(DemographicForm, self).__init__(*args, **kwargs)
        self.helper=FormHelper(self)
        self.fields['date_of_birth'].widget = widgets.AdminDateWidget()
        self.helper.layout = Layout(
            'national_health_care_pat_id',
            'patient_hospital_file_number',
            'patient_id',

            FormActions(
                Submit('submit', "Save changes"),
                Submit('cancel', "Cancel")
            ),

        )
        self.helper.form_tag = False
        self.helper.form_show_labels = True

    class Meta:
        model = demographic
        exclude = []

class DiagnosisForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(DiagnosisForm, self).__init__(*args, **kwargs)
        self.helper=FormHelper(self)
        self.helper.layout = Layout(
            'patient',
            'age_of_diagnosis',

            FormActions(
                Submit('submit', "Save changes"),
               Submit('cancel',"Cancel")
            ),
        )
        self.helper.form_tag = False
        self.helper.form_show_labels = True

    class Meta:
        model = diagnosis
        exclude = []

您知道问题可能是什么吗?提前谢谢!

【问题讨论】:

  • 能否将模型和表单类添加到代码示例中?
  • @Brando 是的,当然!我添加了它们。
  • 您没有将数据传递到 DiagnosisForm ,只是传递到 DemographicForm
  • @Anentropic 你能说得更具体点吗?我做错了什么?
  • @zinon 你真的应该在 Python 中以大写字母开头你的类名,以将它们与实例变量区分开来。

标签: python django django-forms django-views


【解决方案1】:

您需要传入实际的demographic 对象,而不仅仅是DiagnosisForm 的ID。 Django 期望ForeignKey 字段指向它们所代表的对象的一个​​实例。您还需要从 DiagnosisForm 中排除 patient 字段。这将阻止 Django 尝试验证该字段。

# forms.py

class DiagnosisForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        . . .

    class Meta:
        model = diagnosis
        exclude = ['patient']


# views.py

from django.shortcuts import get_object_or_404, render
from your_app.models import Patient

def input(request):
    patient = get_object_or_404(Patient, id=5)
    my_demographics = DemographicForm(request.POST or None)
    my_diagnosis = DiagnosisForm(request.POST or None)

    if request.method =='POST':
        if my_demographics.is_valid() and my_diagnosis.is_valid():
            demographic = my_demographics.save()
            my_diagnosis.save(commit=False)
            my_diagnosis.patient = demographic
            my_diagnosis.save()

    return render(request, 'input.html', {'frm':my_demographics, 'frm_d': my_diagnosis})

【讨论】:

  • 你能给我一个简单的例子吗?
  • 我已经为你添加了一个例子。
  • 我没有模型患者。患者只是诊断模型中的一个字段。我需要将患者编号添加到人口统计表中(在我按下此表的提交按钮后)并将其放入诊断表中,然后填写诊断表并保存。这就是我传递 my_demographics_object.patient_id 值的原因。
  • my_diagnosis = DiagnosisForm(initial={'patient': '5'}) 只是在得到正确的值之前给出一个初始值。
  • 所以,我填写了人口统计表格,保存并从该表格中获取 patient_id 字段值,并将其作为值赋给诊断表中的患者字段。
猜你喜欢
  • 2015-10-13
  • 2013-10-11
  • 2012-09-20
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多