在同一视图上使用两个django模型表单

时间:2016-06-14 14:26:27

标签: django django-forms

我在一个视图PatientRegistrationForm中有一个PatientBillingForm和一个RegisterPatient表单。

当我提交患者表格(form)时,提交的日期存储在数据库中,但是结算表格(form1)仅更新员工和患者字段,并且没有任何内容存储在payment_typeamountreceipt_number

请任何人帮忙指出为什么第二种表格没有在数据库上更新?

以下是视图,模型,表单和模板代码:

views.py

def RegisterPatient(request):
    # bills = obj.bill_set.all()

    form = PatientRegistrationForm(request.POST or None)
    form1 = PatientBillingForm(request.POST or None)

    if form.is_valid() and form1.is_valid():
        instance  = form.save(commit=False)
        instance1 = form1.save(commit=False)

        payment_type = form1.cleaned_data["payment_type"]
        amount = form1.cleaned_data["amount"]
        receipt_number = form1.cleaned_data["receipt_number"]

        first_bill = Billing()
        first_bill.payment_type = payment_type
        first_bill.amount = amount
        first_bill.receipt_number = receipt_number
        # first_bill.saff
        # first_bill.patients
        print first_bill.payment_type, first_bill.amount, first_bill.receipt_number

        first_name = form.cleaned_data["first_name"]
        last_name = form.cleaned_data["last_name"]
        other_name = form.cleaned_data["other_name"]
        phone_number = form.cleaned_data["phone_number"]

        new_patient = Patient()
        new_patient.patient_number = UniquePatientNumber()
        new_patient.first_name = first_name
        new_patient.last_name = last_name
        new_patient.other_name = other_name

        new_patient.save()
        first_bill.save()

model.py

class Patient(models.Model):
    patient_number = models.CharField(max_length=120, unique = True, )
    first_name = models.CharField(max_length = 120)
    last_name = models.CharField(max_length=120)
    other_name = models.CharField(max_length = 120, blank=True, null=True)
    phone_number = models.CharField(max_length=15)

    def _unicode_(self):
        return self.patient_number

class Billing(models.Model):
    staff = models.ForeignKey(MyUser, default=1)
    patients = models.ForeignKey(Patient, default=1)
    payment_type = models.CharField(max_length=100)
    amount = models.DecimalField(max_digits=100, decimal_places=2, default=0.00)
    receipt_number = models.CharField(max_length=120)
        payment_date = models.DateTimeField(auto_now=False, auto_now_add=True)

    def _unicode_(self):
        return self.staff.username

def new_user_receiver(sender, instance, created, *args, **kwargs):
    if created:
        new_patient, is_created = Billing.objects.get_or_create(patients=instance)

post_save.connect(new_user_receiver, sender=Patient)

def new_user_creator(sender, instance, created, *args, **kwargs):
    if created:
        new_user, is_created = Billing.objects.get_or_create(staff=instance)

post_save.connect(new_user_creator, sender=MyUser)

form.py

class PatientRegistrationForm(forms.ModelForm):

    class Meta:
        model = Patient
        exclude = ["patient_number"]

class PatientBillingForm(forms.ModelForm):

    class Meta:
        model = Billing
        fields = ["payment_type","amount","receipt_number"]

forms.html

<form method="POST action="">{% csrf_token %}
   {{ form }}
   {{ form1 }}
   <input type="submit" value="Submit"/>
</form>

1 个答案:

答案 0 :(得分:0)

在您的视图功能中,您始终使用MyUserpk=1创建Patients的新结算,因为您在结算字段pk=1中设置了默认值。您应该删除default=1并设置default=1

如果我理解你的逻辑。您想为每位新用户或新患者创建新的结算信息。我想在您的视图功能中,您希望更新或向患者创建结算信息。如果是这样,你应该致电

null=True,blank=True

Billing.objects.filter(patients__pk=new_patient.pk).update(payment_type=payment_type,amount=amount,receipt_number=receipt_number)之后

,您可以使用new_patient.save()注释掉行。

更新

1)注释掉first_bill

2)在Billing.objects.filter(...)

中注明post_save.connect(new_user_receiver, sender=Patient)

3)再次使用models.py激活行并添加:

first_bill

之后

first_bill.patients=new_patient