簡體   English   中英

如何在Django中以多對一關系將一個模型對象添加到另一模型的ModelForm模板中?

[英]How do I add one model objects to another model’s ModelForm template with many to one relationship in Django?

我正在嘗試創建一個醫院管理系統,其中有兩個ModelForm,一個ModelForm創建Patient對象,另一種形式的Model 2用於承認Patient,這意味着它將在New Form模板中使用Patient對象並帶有新字段並創建新ID分別具有模型ID(患者ID)和模型2 ID(IPD ID),模型2與具有患者ID的模型1鏈接,一個患者可以具有多個IPD ID模型。

class Patient(models.Model): 

    name = models.CharField(max_length=200);
    phone = models.CharField(max_length=20);
    address = models.TextField();
    patient_id = models.AutoField(primary_key=True);
    gender= models.CharField(choices=GENDER, max_length=10)
    consultant = models.CharField(choices=CONSULTANT, max_length=20)

    def __str__(self):
        return self.name 

class Ipd(models.Model):

    reason_admission = models.CharField(max_length=200, blank=False)
    presenting_complaints = models.CharField(max_length=200,)
    ipd_id = models.AutoField(primary_key=True)
    rooms = models.ForeignKey(Rooms,on_delete=models.CASCADE, blank=False)
    date_of_admission = models.DateField(("Date"),
        default=datetime.date.today)  
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE, blank=False, default = "")

    def __str__(self):
        return self.patient.name

form.py:

class PatientForm(forms.ModelForm):


    class Meta:
        model = Patient
        fields = ['name','phone','address','patient_id','consultant','Gender']

class IpdForm(ModelForm):

    class Meta:
        model = Ipd

        fields = ['patient', 'reason_admission', 'presenting_complaints', 

                'rooms', 'date_of_admission']
    def __init__(self, *args, **kwargs):
    super(IpdForm, self).__init__(*args, **kwargs)
    self.fields['patient']=forms.ModelChoiceField(queryset=Patient.objects.all())

views.py:

@login_required
def show(request, patient_id):
    patient = Patient.objects.filter(pk=patient_id)
    return render(request, 'show.html', {'patient': patient})

@login_required
def new(request):
    if request.POST:
        form = PatientForm(request.POST)
        if form.is_valid():
            if form.save():
                return redirect('/', messages.success(request, 'Patient is successfully created.', 'alert-success'))
            else:
                return redirect('/', messages.error(request, 'Data is not saved', 'alert-danger'))
        else:
            return redirect('/', messages.error(request, 'Form is not valid', 'alert-danger'))
    else:
        form = PatientForm()
        return render(request, 'new.html', {'form':form})

@login_required
def edit(request, patient_id):

    if request.POST:
        patient = Patient.objects.get(pk=patient_id)
        form = PatientForm(request.POST, instance=patient)

        if form.is_valid():

            if form.save():
                return redirect('/', messages.success(request, 'Patient is successfully updated.', 'alert-success'))
            else:
                return redirect('/', messages.error(request, 'Data is not saved', 'alert-danger'))
        else:
            return redirect('/', messages.error(request, 'Form is not valid', 'alert-danger'))
    else:
        form = PatientForm(instance=patient)
        return render(request, 'edit.html', {'form':form})



@login_required
def ipd(request, patient_id):
    object = get_object_or_404(Ipd, patient__patient_id=patient_id)
    if request.method == "POST":
        formtwo = IpdForm(request.POST)
        if formtwo.is_valid():
            instance = formtwo.save(commit=False)
            instance.save()
        else:
            return HttpResponse(formtwo.errors) 
    else:
        formtwo = IpdForm()

    return render(request, 'newipd.html', {'object': object, 'form2': formtwo})

urls.py:

url(r'^order/ipd/(?P<patient_id>\d+)/$', my_order.ipd, name='ipd'),

html:

{% for field in form2.visible_fields %}
<div class="card-panel">                                                                                 
<span class="blue-text text-darken-2">Name : {{name}}</span> <br>                                                 
<span class="blue-text text-darken-2">Phone : {{ phone  }}</span><br>                                                  
<span class="blue-text text-darken-2">Address : {{ address  }}</span> 
<br>                                                                                         
<span class="blue-text text-darken-2">Gender : {{ gender  }}</span><br>                                            
</div>

{% endfor %}

您需要在IPD ModelForm的init函數中為患者模型添加modelchoicefield,如下所示

def __init__(self, *args, **kwargs):
    super(IpdForm, self).__init__(*args, **kwargs)
    self.fields['patient']=forms.ModelChoiceField(queryset=Patient.objects.all())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM