Django:将外键值保存在

2024-09-28 20:17:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个与外键相关的表。在

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

问题是,当我试图将字段的值保存在诊断表单上时,第一个表单上的错误是“此字段是必需的”,即使此字段的值是在一分钟前存储的。在

编辑:这是我的解决方案

输入.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>

我的视图.py包含:

^{pr2}$

模型.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)

表单.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 = []

你知道有什么问题吗?提前谢谢你!在


Tags: selfdivformhelperidtrue表单input
1条回答
网友
1楼 · 发布于 2024-09-28 20:17:16

您需要传入实际的demographic对象,而不仅仅是DiagnosisForm的ID。Django希望ForeignKey字段指向它们所表示的对象的实例。您还需要从诊断表单中排除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})

相关问题 更多 >