【问题标题】:Django: Save forms independentlyDjango:独立保存表单
【发布时间】:2014-12-20 09:58:04
【问题描述】:

我在同一个模板的两个不同选项卡中有两个表单。表单的模型通过外键连接。

当我尝试独立保存每个表单时,每个表单都有一个提交按钮,但不幸的是,这两个表单正在尝试再次保存数据,即使我只按下一个提交按钮。

Views.py

def input(request):
    my_demographics = DemographicForm(request.POST or None)
    my_diagnosis = DiagnosisForm(request.POST or None)

    context = RequestContext(request)
    if request.method == 'POST':
        submitted = request.POST.get('form_id', '')

        if submitted == 'demographics':
            # Get the Form1 instance
            my_demographics = DemographicForm(request.POST)
            if my_demographics.is_valid():
                my_demographics_object= my_demographics.save()
                my_diagnosis=DiagnosisForm({'patient': my_demographics_object.patient_id})


        elif submitted == 'diagnosis':
            # Get the Form2 instance
            my_diagnosis = DiagnosisForm(request.POST)
            if my_diagnosis.is_valid():
                my_diagnosis.save()

        else:
            raise ValueError('No form specified !')


return render_to_response('input.html', {'frm':my_demographics, 'frm_d': my_diagnosis}, context)

input.html

<div class="tab-content">

    <!-- Tab panes -->
    <form class="tab-pane fade in active" id="demographics" method="post" >
        <input type="hidden" name="form_id" value="demographics">
        {%crispy frm%}
    </form>
    <form class="tab-pane fade" id="diagnosis" method="post">
         <input type="hidden" name="form_id" value="diagnosis">
        {%crispy frm_d%}
    </form>
</div>

【问题讨论】:

  • 不是真的,OP想用相同的表单提交它们,而链接的问题是关于在同一页面中处理多个提交!
  • 我认为您误读了这个问题 - “......尝试独立保存每个表单,每个表单都有一个提交按钮......”

标签: html django django-forms django-views


【解决方案1】:

视图将包含仅在表单中提交的输入名称,这就是您现在的方式,因此您可以添加一个隐藏字段并检查其值,如果是 form1 或 form2,那么您知道女巫已被提交!

if request.POST:
    # Get the form submitted
    submitted = request.POST.get('form_name', '')

    if submitted == 'form1'
        # Get the Form1 instance
        form = Form1Model(request.POST)

    elif submitted == 'form2'
        # Get the Form2 instance
        form = Form2Model(request.POST)
    else:
         raise ValueError('No form specified !')

    # Validate the form
    if form.is_valid():
        # If the form is valid save it
        if form.save():
            # correct data entry
            messages.info(
                request,
                _(u"Fichier copié sur le DHS, mise à jour en cours ...")
            )
        else:
            # Can't save the form
            messages.warning(
                request,
                _(u"Un problème est survenu pendant l'enregistrement "
                  u"des données, merci de réessayer plus tard.")
            )
    else:
        # Form is not valid, show feedback to the user
        messages.error(
            request,
            _(u"Merci de corriger les erreurs suivantes.")
        )
else:
    # Empty forms this is the first call
    form1 = Form1Model()
    form2 = Form2Model()

    # Disclaimer
    messages.warning(
        request,
        _(u"L'interface web sera inaccessible durant la mise à jour.")
    )

【讨论】:

  • 不,他们没有。视图不知道提交了哪个表单。它只知道发生了 POST。表单需要通过参数来标识,视图可以使用该参数来决定何时处理帖子。
  • 是的,如果你在表单中点击提交,它只会发布表单输入,这是一个基本的 HTML 规范。
  • 视图究竟是如何知道这一点的?
  • @Brandon 你能给我一个简单的例子吗?
  • 该视图将包含仅在表单中提交的输入名称,这就是您现在的方式,因此您可以添加一个隐藏字段并检查其值,如果是 form1 或 form2 那么您知道女巫已提交!
【解决方案2】:

首先在每个表单中添加一个隐藏的输入,它将指定发布哪个表单:

<div class="tab-content">

    <!-- Tab panes -->
    <form class="tab-pane fade in active" id="demographics" method="post" >
        <input type="hidden" name="form_id" value="demographics"> 
        {%crispy frm%}
    </form>
    <form class="tab-pane fade" id="diagnosis" method="post">
        <input type="hidden" name="form_id" value="diagnosis"> 
        {%crispy frm_d%}
    </form>
</div>

然后在您的视图中,检查发布的表单并仅保存此表单。

编辑:

def input(request):
    context = RequestContext(request)
    if request.method == 'POST':
        submitted = request.POST.get('form_id', '')

        if submitted == 'demographics':
            # Get the Form1 instance
            my_demographics = DemographicForm(request.POST)
            if my_demographics.is_valid():
                my_demographics_object= my_demographics.save()
                my_diagnosis=DiagnosisForm({'patient': my_demographics_object.patient_id})
             else:
                my_diagnosis=DiagnosisForm()

        elif submitted == 'diagnosis':
            # Get the Form2 instance
            my_diagnosis = DiagnosisForm(request.POST)
            if my_diagnosis.is_valid():
                my_diagnosis.save()
                # here you should redirect

            my_demographics = DemographicForm()

        else:
            raise ValueError('No form specified !')

    else:
        my_demographics = DemographicForm()
        my_diagnosis = DiagnosisForm()

    return render_to_response(
        'input.html', 
         {'frm':my_demographics, 'frm_d': my_diagnosis}, 
         context
         )

【讨论】:

  • 如何查看发布的表单?
  • form_id = request.POST.get('form_id') request.POST 是一个字典,因此可以使用静态方法 .get()。如果该值不在字典中,则返回None
  • request.POST.get("form_id") 会告诉你。关键是对两个输入使用相同的名称。
  • if 'one_sub' in request.POST: # do something elif 'two_sub' in request.POST: # do something else
  • @madzohan 这只会检查 request.POST 字典中是否存在键,而不是返回它的值。两个隐藏字段的名称相同。键的值是确定视图中正确逻辑所需的值。
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2017-04-18
  • 1970-01-01
相关资源
最近更新 更多