Как реализовать многостраничные формы с отдельными моделями, используя функциональное представление в Django - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать многостраничную форму, в которой каждая форма сохраняется в другой модели. Примером того, что я имею в виду, является исследование стека переполнения. Я читал разные посты по этому вопросу, но большинство из них либо с несколькими формами в одном шаблоне, либо с набором форм. Я смог сделать это с помощью пакета 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)
...