1
class Biochemical_analysis_of_blood(CreateView): 
    model = BiochemicalAnalysisOfBlood 
    form_class = BiochemicalAnalysisOfBloodForm 
    template_name = "biochemical_analysis_of_blood.html" 
    success_url = reverse_lazy("patients") 

    def get_context_data(self, **kwargs): 
     context = super(Biochemical_analysis_of_blood, self).get_context_data(**kwargs) 
     patient = Patient.objects.get(id=1) 
     context["patient"] = patient 
     return context 

    def post(self, request, *args, **kwargs): 
     analysis = Analyzes() 
     sid = transaction.savepoint() 
     analysis.name = request.POST["name"] 
     analysis.patient_id = Patient.objects.get(id=1) 
     analysis.who_send = request.POST["who_send"] 
     analysis.who_is_doctor = request.POST["who_is_doctor"] 
     analysis.lab_user_id = Doctor.objects.get(id=request.POST["lab_user_id"]) 
     analysis.additional_lab_user = request.POST["lab_user_add"] 
     analysis.date = '2017-06-18' 
     analysis.type = 3 
     analysis.date_analysis = '2017-06-18' 
     analysis.save() 
     return super(Biochemical_analysis_of_blood, self).post(request, *args, **kwargs) 

一些麻煩與CreateView的我未來的算法:在Django的

  1. 渲染BiochemicalAnalysisOfBloodForm用戶

  2. 當他填寫的字段,並按下按鈕,「保存」創建一個新的實例的Analyzes()並以編程方式填充,並且當在後期方法中我調用super().post()時,那麼用戶數據將自動寫入模型BiochemicalAnalysisOfBlood?但我有一個錯誤:

NOT NULL constraint failed: laboratory_biochemicalanalysisofblood.analysis_id

我在手動模式如何可以添加到模型,創建初期的Analyzes()實例領域的「分析」?我不明白這個類來結束我在哪裏可以找到有關的所有信息,它的機會

+0

你可以發佈您的形式BiochemicalAnalysisOfBloodForm的內容? – SebCorbin

+0

爲什麼不能有一個單獨的自動填寫的id,並且將analysisid設置爲空字段? – mikep

回答

1

你的算法的主要部分應該駐留在你的形式,因爲要在analysis_id傳遞到實例被保存

class BiochemicalAnalysisOfBloodForm(ModelForm): 
    def save(self, commit=True): 
     analysis = Analyzes() 
     sid = transaction.savepoint() 
     analysis.name = self.data["name"] 
     analysis.patient_id = Patient.objects.get(id=1) 
     analysis.who_send = self.data["who_send"] 
     analysis.who_is_doctor = self.data["who_is_doctor"] 
     analysis.lab_user_id = Doctor.objects.get(id=self.data["lab_user_id"]) 
     analysis.additional_lab_user = self.data["lab_user_add"] 
     analysis.date = '2017-06-18' 
     analysis.type = 3 
     analysis.date_analysis = '2017-06-18' 
     analysis.save() 
     # Your analysis is created, attach it to the form instance object 
     self.instance.analysis_id = analysis.id 
     return super().save(commit) 
0

做超()之前發佈,你可以修改request.POST數據,包括您的分析ID:

request.POST['analysis_id'] = analysis.id 

這可能會有所幫助。

另請注意,如果表單驗證在super()。post中失敗,您仍然會創建一個可能沒有用的Analysis對象。你可以使用覆蓋CreateView的form_invalid方法來處理這個。

+0

我做了它,並有下一個錯誤「此QueryDict實例是不可變的」,然後我添加下一代碼 「如果不request.POST._mutable: request.POST._mutable = True」,並再次出現此錯誤「NOT NULL約束失敗: laboratory_biochemicalanalysisofblood.analysis_id「 @Lucas Moeskops –

+0

啊,是的,這有點複雜。理想情況下,request.POST不應該被編輯,你可以通過在CreateView上重寫'get_form_kwargs'方法來修改發送給表單的參數。然後,您將需要創建一個包含request.POST和analysis_id的自定義字典。那麼如果分析存在,它應該工作。 –