Django - 如何根据请求创建一个可选字段

Django - How to make an optional field required based on request

我希望能够在表单未完全填满时将其保存为草稿,并像往常一样使用经典的 Django 表单验证将其保存。

为此,我在我的表单中有两个提交按钮,我在我的 post 请求中找到了哪个按钮被点击了:

class MyView(UpdateView):
     def post(self, request, *args, **kwargs):

        def submit_draft(self, request):
                if 'draft' in request.POST:
                    out = True
                else:
                    out = False
                return out

在我的模型中,我的所有字段都允许空白字段,因此将不完整的表格保存为 草稿 如果字段为空则不会出现问题。

我想在使用正常 保存 操作保存表单时将表单字段设置为必需。

我目前想到但没有成功实施的一个方案:

=> 覆盖 get_form 函数,这样当我点击 Save as draft 时,它只是执行正常操作,当我点击 保存,它修改了我的字段必填属性。

tldr: 我正在寻找一种方法来根据已单击的提交按钮对我的表单执行类似的操作

for field in form:    
        self.fields[field].required = True

我过去使用的一个解决方案是在单击 "save draft" 按钮时将表单的内容序列化为 "drafts" table。

当用户返回编辑表单时,您将 json 加载回表单以继续编辑。这可以使用 javascript 或在 django 表单视图中完成。

您可能会遵循的一些步骤:

  1. 单击 "Save Draft" 时,post 表单到草稿视图。
  2. 将内容序列化为json;将内容存储在 "drafts model".
  3. 当用户单击重新打开草稿时,从数据库中提取内容,将 json 解析回表单。
  4. 当用户单击 "Save" 时,您将表单内容保存到数据库中并从 "drafts table" 中删除草稿。

这是您的 Drafts 模型的示例。

class Drafts(models.Model):
    user = models.ForeignKey(User)
    form_name = models.CharField(max_length=100)
    serialised_form = models.TextField() # could use json field here

    def to_dict(self):
        return json.loads(self.serialised_form)

我发现这种方法比

有很多优点

通过如下子类化我的表单解决了我的问题:

我的表格基于我的模型,空和空白 = True

class RegionForm(forms.ModelForm):
    class Meta:
        model = Region
        fields = ['region_name',
                  'region_description'
                  ]

    def __init__(self, *args, **kwargs):
        super(RegionForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].required = True

class RegionDraftForm(RegionForm):
    class Meta(RegionForm.Meta):
        pass

    def __init__(self, *args, **kwargs):
        super(RegionDraftForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].required = False

这样我就可以在我的视图中实例化我需要另存为草稿或通常保存完整表单验证的表单。