Django - 跨多个视图形成并保存进度

时间:2018-03-17 14:59:35

标签: python django

我正在开发一个Django项目并使表单体验更顺畅我想在几页内传播ModelForm。如果登录的用户可以在不实际发布内容的情况下保存表单中的进度(在这种情况下是JobApplication,用户可以返回填写信息而不实际发送应用程序),这将是理想的。

目前我已经查看过关于SO的其他答案,例如this one;但这只能告诉我如何利用缓存在表单所在的视图之间存储信息。

Models.py(模型,表格和视图已经简化以便于阅读):

class JobApplication(models.Model):
    job = models.ForeignKey(JobPost,on_delete=models.SET_NULL,...)
    user = models.ForeignKey(AUTH_USER_MODEL,...)
    details = models.CharField(max_length=300)
    skills = models.CharField(max_length=300)
    feedback = models.CharField(max_length=300)
    #... [insert more fields] ...

Forms.py:

class Application(forms.ModelForm):
    details = forms.CharField() # To go in page 1 of the form process
    skills = forms.CharField() # To go in page 2
    feedback = forms.CharField() # To go in page 3
    class Meta:
        model = JobApplication
        fields = ['details','skills','feedback']

Views.py:

from . import forms
def view1(request):
    form = forms.Application()
    if request.method == 'POST':
        form = forms.Application(data=request.POST)
        ... some logic here which I am not sure of ...
    return render(request, 'view1.html', {})

def view2(request):
    form = forms.Application()
    if request.method == 'POST':
        form = forms.Application(data=request.POST)
        ...
    return render(request, 'view2.html', {})

def view3(request):
    form = forms.Application()
    if request.method == 'POST':
        form = forms.Application(data=request.POST)
        ...
    return render(request, 'view3.html', {})

请注意,我很乐意编辑我的表单或模型以实现此多页,保存您在作业网站上看到的进度效果。

让我知道是否还有更多可以添加的代码,因为我不太确定还需要什么。

谢谢!

3 个答案:

答案 0 :(得分:3)

  1. 我在我的应用程序中有一个类似的用例我创建的内容 模型的多重形式和控制模型的中心视图 形式的进展。

    该视图包含必须通过

    传播的表单列表
    GET : /form/<index> => form/0
    POST : Save data to the form
    
  2. 最初,表单没有初始数据,索引&gt; 0 初始数据将是先前保存的模型对象

  3. 当用户点击下一个增加URL索引计数器时,减少 它为prev,不要在skip上保存任何内容

  4. 这是一个如何看待的要点。 https://gist.github.com/bhavaniravi/b784c57ae9d24fce359ae44e2e90b8e3

      

    我不知道这是否是有史以来最佳的优化方法,但这就是我所做的。任何有关改进的建议都是最受欢迎的

答案 1 :(得分:2)

您需要一个表单来执行您需要的每个操作。有了它,您可以使用Django 1.7中的一个名为Form Wizard的功能(是的,内置),实现这一目标的最佳方法是使用基于类的视图,这比FBV更灵活,更干净,更有凝聚力情况下。

https://docs.djangoproject.com/en/1.7/ref/contrib/formtools/form-wizard/#

基本上,您将定义一个步骤和表单列表,这两个步骤和表单都绑定到同一个URL。您可以为每个表单使用自定义模板:

https://docs.djangoproject.com/en/1.7/ref/contrib/formtools/form-wizard/#using-a-different-template-for-each-form

[EDITED]

正如jayt在评论中所说,自1.8版本以来,formtools已被弃用,现在与核心软件包不同,可以在https://github.com/django/django-formtools/

中找到 祝你好运。 =)

答案 2 :(得分:2)

  

我正在开发一个Django项目,并使表单体验远远不够   更顺畅我想在几页上传播一个ModelForm。这将是   如果登录的用户可以在表单中保存他们的进度,这是理想的   没有实际发布内容(在这种情况下,是一个JobApplication   用户可以回来填写信息而无需实际发送   关闭申请。)

您正在将UI / UX概念与技术实现混合在一起。

您的整个流程是一个工作申请,您有以下状态:

  1. 如果尚未创建新申请人(用户)
  2. 为该用户创建新的应用程序
  3. 处理该应用程序,直到用户说完成(允许跨越多个(浏览器)会话)
  4. 将申请标记为已完成 - &gt;实际上适用于工作
  5. 如何收集应用程序的数据(以任何形式或类似方式)并在Web开发意义上“提交”与实际的工作申请行动无关 - 它只需要事先发生。

    因此,您不仅可以使用单个Django表单,还可以使用以下方法:

    (A)创建较小的模型,代表表单的某个内容部分,并且应该获得自己的表单。为这些创建ModelForms并使它们可以在自己的视图中访问。

    (B)坚持使用单一模型,但按照您的计划为每个单独的页面创建自定义Django表单。您仍然可以使用ModelFormmodel=JobApplication,但每个表单都必须指定它所涵盖的字段集,并仅验证这些字段。

    进度跟踪

    (A)或(B):您可以跟踪输入的信息量(以百分比表示,例如,只需计算所有字段和所有非空字段并计算其百分比。

    (A):使用不同的django模型,您可以为每个模型添加最后修改的时间戳,并显示是否以及何时编辑此部分。

    主页

    在概述页面中,您可以收集用户的所有数据,以便他们可以看到应用程序的外观(甚至可能是其他人) - 并且他们也可以点击“申请工作!”按钮。 ,或者如果他们发现任何数据尚未完成,他们可以打开每个特定表格。

    实际工作申请

    一旦用户点击“申请作业”,就会发生不同的POST,例如在JobApplication模型上设置日期时间字段。这样,您就可以识别已经到达此流程步骤的所有应用程序。

    与之后发生的任何其他步骤相同。也许用户可以通过复制现有应用程序来创建另一个应用程序或者他们接受的状态也输入到该系统中,他们可以登录并检查。或者系统发送电子邮件通知或类似信息。只需为感兴趣的内容添加字段,然后您也可以在UI中反映出来。