Django - 如何根据请求

时间:2015-06-26 07:48:14

标签: python django django-forms django-views

我希望能够在没有完全填满的情况下将表单保存为草稿,并且像往常一样使用经典的django表单验证来保存它。

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

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

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

我希望在使用正常的 save 操作保存表单时,需要使用表单字段。

到目前为止我已经考虑过但没有成功实施的一个选项:

=>覆盖 get_form 函数,以便当我点击另存为草稿时,它只是执行正常操作,当我点击保存时,它会修改我的字段必需属性

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

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

2 个答案:

答案 0 :(得分:2)

通过按如下方式对我的表单进行子类化来解决我的问题:

我的表单基于我的模型,null和blank = 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

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

答案 1 :(得分:0)

我过去使用过的解决方案是将表单的内容序列化为"草稿"表"保存草稿"单击按钮。

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

您可能会遵循以下步骤:

  1. 当"保存草稿"单击,将表单发布到草稿视图。
  2. 将内容序列化为json;将内容存储在"草稿模型"。
  3. 当用户点击重新打开草稿时,从数据库中提取内容,将json解析回表单。
  4. 当用户点击"保存"将表单内容保存到数据库中并从"草稿表"中删除草稿。
  5. 这是您的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)
    

    我认为这种方法比

    有许多优点