首页 > 解决方案 > 使用重定向将模型对象(具有许多字段)从视图函数传递到另一个视图函数而不保存它

问题描述

我是这个领域的新手...所以要温柔:) 问题可以表述如下: 视图1:提出了一个基于14个字段模型的表单。用户填写它并按下发布按钮。(重要:不在数据库中保存模型实例) 视图 2:出现一个确认页面,其中包含他输入的内容的摘要。然后他被要求 - 取消(不要费心擦除数据库中的任何内容) - 编辑(尚未保存但可以更改信息) - 确认(现在是时候将其保存在数据库中了)。

并且应该只能访问一次,如果没有完成......它会消失(避免在数据库中创建大量实例)

目前一切都是静态的,因为它从一开始就保存在数据库中并留在那里,所以如果有人离开,它就会毫无保留地留在数据库中

我寻找了一些解决方案,但总是破解以下错误。第一个是直接传递模型实例(Mycard),它登陆到>'str'对象没有属性'_meta'所以我希望通过URL传递信息,但看起来之后会很长......我也尝试过 request.session 但它说我的模型不是兼容的 JSON 文件 >“MyCardProfile”类型的对象不是 JSON 可序列化的。

我正在使用 Django 2.1.7

模型.py

class MyCardProfile(models.Model):
    """ This model defines the fields required for a my card """

    # identity of the post user
    name = models.CharField(max_length=100) 
    email = models.EmailField(max_length=100)

    # The Card information:
    place = models.CharField(max_length=100)    


    # Short title description
    title = models.CharField(null=True, blank=True, max_length=100, default='Check it') 
    description = models.CharField(max_length=1500)

    # Managing
    manager1 = models.CharField(null=True, blank=True, max_length=100) 
    manager2 = models.CharField(null=True, blank=True, max_length=100) 

    # Tracking
    status = models.CharField(default='', max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    end_at = models.DateTimeField(null=True, blank=True)




    def __str__(self):
        return self.title

表格.py

class MyForm(forms.ModelForm):
    """
        Form for the Card
    """
    name = forms.CharField(required=True, label='Name',widget=forms.TextInput(attrs={'id':'name'}))
    title = forms.CharField(required=True, label='Short title', widget=forms.TextInput(attrs={'placeholder': 'Describe it in short','id':'title'}))
    email = forms.EmailField(required=True, label='Email', widget=forms.TextInput(attrs={'placeholder': 'Your Email'}))

    place = forms.CharField(required=True, label='Place', widget=forms.TextInput(attrs={'id':'place'}))

    description = forms.CharField(required=False, label='Description', widget=forms.Textarea(attrs={'placeholder': 'Tell us something.'}))


    class Meta:
        model = MkProfile
        fields = ['name', 'email', 'place', 'title', 'description', ]

视图.py

def formMy(request):
    context = {}
    context['pagename'] = "My form"

    if request.method == 'POST':

        My_card = MyForm(request.POST)

        if My_card.is_valid():
            Mycard = My_card.save(commit=False)          
            Mycard.manager = 'example1'
            Mycard.manager2 = 'example2'
            Mycard.save() #I would like to avoid that

            return redirect('formMyconfirmation', id=Mycard.pk)

    else:
        My_card = MyForm()
        pictures_form = MyPicturesForm()

    context['Myform'] = My_card    
    return render(request, 'forms/formMy.html', context)




def formMyconfirmation(request, id):

    ##I would like to have access to the unsaved Mycard##
    context = {}
    context['pagename'] = 'My Card #'+str(id)+' confirmation'
    Mycard = get_object_or_404(MyCardProfile, id=id)
    context['meldekarte'] = Mycard

    if request.method == 'POST':
    ##It's here that I would like to save Mycard##
        return redirect('survey', id=Mycard.pk)

    return render(request, "forms/formMyconfirmation.html", context)


网址.py

urlpatterns = [
    path('My/', user_views.formMy, name='formMy'),
    path('My_confirm/<int:id>/', user_views.formMy_confirmation, name='formMyconfirmation'),
    path('My_edit/<int:id>/', user_views.formMy_edit, name='formMyedit'),
    path('My_delete/<int:id>/', user_views.formMy_delete, name='formMydelete'),
    path('survey/<int:id>/', user_views.survey, name='survey'),
]

我的愿望是不要将数据保存在 View1 (formMy) 中,而是将信息直接传递给 View2 (formMy_confirmation),然后在确认后保存...这样以后就没有人可以访问确认了(也许还有另一种方法去做)或用无用的信息填充数据库,如果它没有完成。

预先感谢您的任何帮助

标签: pythondjangoredirectviewmodel

解决方案


推荐阅读