Я пытаюсь создать многостраничную форму, в которой каждая форма сохраняется в другой модели. Примером того, что я имею в виду, является исследование стека переполнения. Я читал разные посты по этому вопросу, но большинство из них либо с несколькими формами в одном шаблоне, либо с набором форм. Я смог сделать это с помощью пакета form-tool. Как новичок ie, я надеялся, что может быть способ достичь этого, используя представление на основе функций. Ниже моя реализация пакета инструментов fool-tool.
Views.py
class FormWizardView(SessionWizardView):
template_name = "new_rental.html"
form_list = [NewRentalPropertyForm, NewContractForm]
file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'images'))
def done(self, form_list, **kwargs):
rentalproperty_instance = RentalProperty()
contract_instance = Contract()
for form in form_list:
rentalproperty_instance = construct_instance(form, rentalproperty_instance)
contract_instance = construct_instance(form, contract_instance)
rentalproperty_instance.save()
contract_instance.rentalproperty = rentalproperty_instance
contract_instance.save()
return redirect('rental:home')
urls.py
path('new_rental/<int:pk>', FormWizardView.as_view(forms), name='new_rental'),
Html Шаблоны
{% load i18n %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">
{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
{{ wizard.form.management_form }}
{% for form in wizard.form.forms %}
{{ form }}
{% endfor %}
{% else %}
{{ wizard.form }}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans "first step" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
{% endif %}
<input type="submit" value="{% trans 'submit' %}"/>
</form>
models.py
class Landlord(models.Model):
user = models.OneToOneField(UserModel, on_delete=models.CASCADE)
address = models.CharField(max_length=255)
def __str__(self):
return str(self.address)
class RentalProperty(models.Model):
landlord = models.ForeignKey("Landlord", related_name='rentalpropertys', on_delete=models.CASCADE)
created_by = models.ForeignKey(UserModel, related_name='rentalpropertys', on_delete=models.CASCADE)
title = models.TextField(unique=True)
created_at = models.DateTimeField(auto_now_add=True)
PROPERTY_LISTING_CHOICES = Choices(
('APARTMENT', _('Apartment')),
('HOLIDAY_HOME', _('Holiday home')),
('SINGLE_FAMILY_HOME', _('Single family home')),
('COMMERCIAL', _('Commercial')),
)
type_of_property_listing = models.CharField(
max_length = 50,
choices = PROPERTY_LISTING_CHOICES,
default = PROPERTY_LISTING_CHOICES.APARTMENT,)
street = models.CharField(max_length=255)
borough = models.CharField(max_length=255)
image = models.ImageField(upload_to='images/', null=True, blank=True,)
def __str__(self):
return str(self.title)
class Contract(models.Model):
rentalproperty = models.ForeignKey("RentalProperty", related_name='contracts', on_delete=models.CASCADE)
insurance_required = models.BooleanField(default=True)
other_terms = models.TextField(blank=True)
def __str__(self):
return str(self.insurance_required)