【问题标题】:some troubles with CreateView in the DjangoDjango 中 CreateView 的一些问题
【发布时间】:2017-11-20 14:46:43
【问题描述】:
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)

我有下一个算法:

  1. BiochemicalAnalysisOfBloodForm 呈现给用户

  2. 当他填写字段并按下“保存”按钮时,我创建了一个 Analyzes() 的新实例并以编程方式填充它,当在 post 方法中我调用 super().post() 时,用户数据将被写入模型 @ 987654325@自动?但我有下一个错误:

NOT NULL 约束失败: lab_biochemicalanalysisofblood.analysis_id

如何在手动模式下将模型添加到字段“分析”Analyzes() 的早期创建实例?我不明白这门课到底在哪里我可以找到有关所有机会的信息

【问题讨论】:

  • 你能把你的表格 BiochemicalAnalysisOfBloodForm 的内容贴出来吗?
  • 为什么没有单独的自动填充 id 并且 analysisid 是一个可为空的字段?

标签: python django django-generic-views django-class-based-views


【解决方案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)

【讨论】:

    【解决方案2】:

    在执行 super().post 之前,您可以修改 request.POST 数据以包含您的分析 ID:

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

    这可能会有所帮助。

    还要注意,如果在 super().post 中表单验证失败,您仍然会创建一个可能没有用的 Analysis 对象。您可以使用覆盖 CreateView 的 form_invalid 方法来处理此问题。

    【讨论】:

    • 我做到了,然后出现下一个错误“这个 QueryDict 实例是不可变的”,然后我添加下一个代码“如果不是 request.POST._mutable: request.POST._mutable = True”,然后又出现这个错误“ NOT NULL 约束失败:laboratory_biochemicalanalysisofblood.analysis_id" @Lucas Moeskops
    • 啊,是的,它有点复杂。 request.POST 最好不要编辑,您可以通过覆盖 CreateView 上的 get_form_kwargs 方法来修改发送到表单的参数。然后您将需要创建一个包含 request.POST 和 analysis_id 的自定义字典。然后,如果分析存在,它应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2019-09-08
    • 2014-03-13
    • 2013-10-20
    • 2017-02-06
    • 2019-03-20
    相关资源
    最近更新 更多