【问题标题】:Django save 2 forms on single page, populate foreign key automaticallyDjango在单页上保存2个表单,自动填充外键
【发布时间】:2012-03-14 03:25:19
【问题描述】:

我有两种形式:一种接受用户信息(姓名、生日等):formA.另一个包含用户可以输入文本的文本字段:formB。

formB 的模型具有实际的文本字段,以及将其链接到该文本所属的用户的“名称”。此字段称为 text_name。 text_name 是链接到 Name 模型(链接到 formA)的外键。

在我的视图模板中,我只允许用户看到他们可以从formB输入信息的文本框,他们还可以看到formA中的所有字段。 这意味着 text_name 下拉框不显示。

formA 目前正在使用来自不同会话的数据进行预填充。

这是我的看法:

def name(request):

    ses = request.session.get('ses',  None)

    formA = Name_Form(request.POST, instance = ses)
    formB = Text_Form(request.POST or None)
    formB.text_name = ses

    if request.method == 'POST':
            formB.text_name = ses
            if formA.is_valid() and formB.is_valid():
                    formB.note_job = ses
                    a = formA.save()
                    a.save()
                    b = formB.save()
                    b.save()

formB 无效,因为未填充 text_name。我尝试使用这一行填充:

formB.text_name = ses

但这没有用。

如何使用已经输入的信息自动填充 text_name 而无需在模板中实际显示 text_name 并因此强制用户实际手动选择适当的 text_name。

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    如果您想在保存之前对模型表单的模型实例进行额外处理,至少有两个简单的选项:

    1. 在保存前访问modelform模型实例,通过form.instance:formB.instance.text_name = ses; formB.save()

    2. 手动保存commit=FalseobjB = formB.save(commit=False); objB.text_name = ses; objB.save(),在这种情况下,请确保 Text_Form 在其excluded field list 中包含“text_name”。

    【讨论】:

    • 我会把它放在 is_valid if 语句中还是之前?
    猜你喜欢
    • 2019-01-03
    • 2011-02-24
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2012-09-20
    • 2011-04-29
    • 2021-07-17
    相关资源
    最近更新 更多