同时使用两种形式

Use two forms at the same time

我想在我的模板中提交两个表单。这样做的原因是,我有两个独立的模型,每个模型都有一个模型表单,我必须同时提交它们才能创建所需的结果:

我有这两种形式:

class BootstrapModelForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(BootstrapModelForm, self).__init__(*args, **kwargs)
        for field in iter(self.fields):
            self.fields[field].widget.attrs.update({
                'class': 'form-control'
            })

class DeckForm(ModelForm):
    class Meta:
        model = Deck
        exclude = ('dust',)

class GuideForm(BootstrapModelForm):
    class Meta:
        model = Guide
        exclude = ('author', 'upvotes', 'downvotes', 'release_date', 'modified', 'deck')

    def __init__(self, *args, **kwargs):
        super(GuideForm, self).__init__(*args, **kwargs)
        self.fields['title'].label = 'Title of your AWESOME Guide!'
        self.fields['public'].label = 'Check, when you want to make your guide public'
        self.fields['public'].widget.attrs.update({
            'class': 'checkbox'
        })
        self.fields['introduction'].label = 'Introduction (not required, but recommended)'

牌组是创建的指南的一部分。由于用户在编写指南的同时应该能够创建他自己的套牌,所以我需要两个表格。

在我看来我是这样处理的:

def guide_create(request):
    if request.method == "POST":
        deck_form  =  DeckForm(request.POST)
        guide_form = GuideForm(request.POST)
        if guide_form.is_valid() and deck_form.is_valid():
            new_deck  = deck_form.save(commit=False)
            new_deck.dust = 0
            new_deck.save()

            new_guide = deck_form.save(commit=False)
            new_guide.author = Account.objects.get(id=request.user.id)
            new_guide.deck = Deck.objects.get(id=new_deck.id)
            new_guide.save()
        else:
            print(guide_form.errors)
            print(deck_form.errors)
    else:
        deck_form = DeckForm(prefix = 'DeckForm')
        guide_form = GuideForm(prefix = 'GuideForm')

    return render(request, 'hsguides/guide_create.html', {
        'DeckForm': DeckForm,
        'GuideForm': GuideForm,
    })

我使用 commit=False 所以我仍然可以在我的指南中插入套牌。现在我的问题在于创建模板。当我使用当前设置提交表格时,我不再收到任何错误,但指南和卡片组也没有保存!

<div style="width: 60%; margin: 0 auto;">

  <form class="form-horizontal" method="POST" action="{% url 'GuideCreate' %}"> {% csrf_token %}
    <fieldset>
      {% for field in DeckForm %}
        {% if field.errors %}
          <div class="class-group error">
            <label class="control-lable">{{ field.label }}</label>
            <div class="controls">{{ field }}
              <span class="help-inline">
                {% for error in  field.errors %}{{ error }}{% endfor %}
              </span>
            </div>
          </div>
        {% else %}
          <div class="control-group">
            <label class="control-label">{{ field.label }}</label>
            <div class="controls">{{ field }}</div>
          </div>
        {% endif %}
      {% endfor %}
    </fieldset>


    <fieldset>
      {% for field in GuideForm %}
        {% if field.errors %}
          <div class="class-group error">
            <label class="control-lable">{{ field.label }}</label>
            <div class="controls">{{ field }}
              <span class="help-inline">
                {% for error in  field.errors %}{{ error }}{% endfor %}
              </span>
            </div>
          </div>
        {% else %}
          <div class="control-group">
            <label class="control-label">{{ field.label }}</label>
            <div class="controls">{{ field }}</div>
          </div>
        {% endif %}
      {% endfor %}
    </fieldset>

    <div class="form-actions" style="margin-top: 4px;">
      <button type="submit" class="btn btn-default">Submit</button>
    </div>

  </form>
</div>

编辑 我没有再收到错误消息,套牌也已创建,但属于它的指南没有。

我没有检查全,但是这个地方不对,应该是:

if request.method == "POST":
    deck = DeckForm(request.POST)
    if deck.is_valid():
        # ....

您没有将 POST 数据打包到您的表格中..

第二种形式也是如此

试试这个,你可能会忘记传递 RequestContext:

from django.template import RequestContext

return render_to_response('hsguides/guide_create.html', 
                          {'DeckForm': DeckForm, 'GuideForm': GuideForm},
                          RequestContext(request))

它将 csrf 令牌传递给模板。

只是改变

return render_to_response('hsguides/guide_create.html', {
    'DeckForm': DeckForm,
    'GuideForm': GuideForm,
})

return render(request,'hsguides/guide_create.html', {
    'DeckForm': DeckForm,
    'GuideForm': GuideForm,
})

您是说指南未创建。我看到这一行 new_guide = deck_form.save(commit=False)..... 不应该是 new_guide = guide_form.save(commit=False) 吗? 不是 100%,但这可能是一个错误。希望这不仅仅是因为您重构了将它放在这里的代码。