Je souhaite soumettre deux formulaires dans mon modèle. La raison en est, que j'ai deux modèles distincts, chacun avec une forme de modèle, que je dois présenter en même temps pour créer le résultat souhaité:Utiliser deux formulaires en même temps
Je ces deux formes:
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)'
Un jeu fait partie du Guide créé. Depuis l'utilisateur devrait être en mesure de créer son propre pont en écrivant son guide, j'ai besoin de deux formes.
Dans mon point de vue je manipulaient comme ceci:
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,
})
J'utilise commit=False
donc je ne peux toujours insérer le pont dans mon guide. Maintenant, mon problème vient avec la création du modèle. Lorsque je soumets les formulaires avec ma configuration actuelle, je ne reçois plus d'erreurs mais le guide et le deck ne sont pas sauvegardés non plus!
<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>
Modifier Je ne reçois pas de message d'erreur plus, la plate-forme est créé ainsi, mais le guide qui lui appartient pas.
Pouvez-vous dans le modèle déplacer tout le code dans le deuxième formulaire à la fin du premier '
Vous dites que le guide n'est pas créé. Je vois cette ligne 'new_guide = deck_form.save (commit = False)' ..... ne devrait-il pas être 'new_guide = guide_form.save (commit = False)'? Pas 100% mais cela pourrait être une erreur. Heureusement, ce n'est pas seulement parce que vous avez refaçonné le code pour le mettre ici. –
@ vlad-ardelean nope, qui était en fait juste .. Je suis si aveugle ... Vous pouvez poster que la réponse: D –