Django - 跨多个视图形式,节省进度

jay*_*ayt 5 python django

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

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

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] ...
Run Code Online (Sandbox Code Playgroud)

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']
Run Code Online (Sandbox Code Playgroud)

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', {})
Run Code Online (Sandbox Code Playgroud)

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

让我知道是否还有我可以添加的代码,这将是有用的,因为我不太确定还需要什么.

谢谢!

Bha*_*avi 5

  1. 我在我的应用程序中有一个类似的用例,我所做的是在模型之外创建多个表单和一个控制表单进度的中央视图。

    视图有一个必须通过它传播的表单列表

    GET : /form/<index> => form/0
    POST : Save data to the form
    
    Run Code Online (Sandbox Code Playgroud)
  2. 最初表单将没有初始数据,对于索引 > 0,初始数据将是之前保存的模型对象

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

这是它的外观的要点。 https://gist.github.com/bhavaniravi/b784c57ae9d24fce359ae44e2e90b8e3

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


And*_*ado 2

您需要的每项操作都需要一张表格。有了它,您可以使用 Django 1.7 中称为“表单向导”的功能(是的,它是内置的),实现此目的的最佳方法是使用基于类的视图,这比 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

[已编辑]

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

祝你好运。=)