【问题标题】:Django form.save() to another class/functionDjango form.save() 到另一个类/函数
【发布时间】:2015-11-29 20:04:34
【问题描述】:

我如何 .save() 到另一个类/函数,例如:

def save_page(request):

    # contains 3 fields

    form = sample_tableform(request.POST)
    if request.method == 'POST':
        if form.is_valid():

    #send a confirmation code to email
    #redirect to code confirmation page

def valcode(request):

    #contains 1 field

    sub_form = confirmform(request.POST)
    if request.method == 'POST':

        if sub_form.is_valid():

            #compare if code from save_pages matches the input field
            # if it matches then the data can be stored

            form.save()
            subform.save()

有没有可能?

我喜欢使用会话的想法,但我该如何实现呢?

【问题讨论】:

  • 您要么必须将数据传递到下一个视图视图 url 参数或会话,要么将其序列化到具有与 valcodes 输入框匹配的 uuid 的数据库。如果匹配,则从数据库中获取并取消序列化,然后将其应用于 sample_tableform
  • 我如何进行会话?我这样做吗? ` form = sample_tableform(request.POST) form_data = form(initial=request.session.get('form'))`

标签: python django python-2.7 django-views


【解决方案1】:

假设你的代码来自你的views.py,答案是你不能

Views 不是这样工作的(HTTP 也不是)。如果您想在后续 HTTP 请求之间访问数据,则必须将其保存在某个地方。

在您的情况下,您可能需要使用model 将验证码存储在数据库中:

# models.py
from django.db import models

class ValidationCode(models.Model):
    code = models.CharField(max_length=10, unique=True)
    creation_date = models.DateTimeField(auto_now_add=True)
    is_validated = models.BooleanField(default=False)

# views.py

def save_page(request):

    # contains 3 fields

    form = sample_tableform(request.POST)
    if request.method == 'POST':
        if form.is_valid():

    validation_code = ValidationCode(code="random_code_here")
    validation_code.save()

    # send email with the code here    
    #redirect to code confirmation page

def valcode(request):

    #contains 1 field

    sub_form = confirmform(request.POST)
    if request.method == 'POST':

        if sub_form.is_valid():

            try:
                code_from_db = ValidationCode.objects.get(code=form.fields['code'])
            except ValidationCode.DoesNotExist: 
                # Not code matching input exist in database
                # return some error to the user

            # code exist in db, just mark it as validated
            code_from_db.is_validated = True
            code_from_db.save()

【讨论】:

  • 我有点想我会走那条路,谢谢你的回复
【解决方案2】:
import json, uuid

# models.py
from django.db import models

class ValidationCode(models.Model):
    confirmation_code = models.CharField(max_length=255, unique=True)
    form_data = models.CharField(max_length=255, unique=True)
    create_datetime = models.DateTimeField(auto_now_add=True)

# views.py

def save_page(request):

    # contains 3 fields

    form = sample_tableform(request.POST)
    if request.method == 'POST':
        if form.is_valid():
            confirmation_code = uuid.uuid4()
            validation_code = ValidationCode(confirmation_code=confirmation_code, form_data=json.dumps(request.POST))
            validation_code.save()
            # send email with the code here    
            #redirect to code confirmation page

def valcode(request):

    #contains confirmation_code field

    sub_form = confirmform(request.POST)
    if request.method == 'POST':
        if sub_form.is_valid():
            try:
                code = ValidationCode.objects.get(confirmation_code=form.fields['confirmation_code'])
                tableform = sample_tableform(json.loads(code.form_data))
                if tableform.is_valid():
                    tableform.save()
            except ValidationCode.DoesNotExist: 
                # return error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 2018-02-16
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多