[英]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.