Как мне объединить две формы модели в одном представлении с полями, отображаемыми в произвольном порядке?

#python #django #forms

#python #django #формы

Вопрос:

Допустим, у меня есть следующие две модели Django.

 class FruitBasket(models.Model):
    apple = models.CharField()
    strawberry = models.CharField()

class VegetableGarden(models.Model):
    celery = models.CharField()
    turnip = models.CharField()
 

Если я хочу создать одно представление для пользователя, чтобы создать как a FruitBasket , так и a VegetableGarden в одной и той же форме, я могу создать по одному ModelForm для каждого и передать их в мое представление следующим образом:

 <form action="" method="post">
    {% csrf_token %}
    {{ fruit_form.as_p }}
    {{ vegetable_form.as_p }}
    <input type="submit" value="Submit" />
</form>
 

Это позволит пользователю вводить поля яблока, клубники, сельдерея и репы в таком порядке.

Что, если вместо этого я хотел отобразить поля в порядке репа, клубника, сельдерей, а затем яблоко? Я хочу избежать написания совершенно нового Form класса, поскольку мне пришлось бы дублировать все проверки ( clean функции). Есть ли способ произвольно определять порядок полей при объединении двух форм?

Ответ №1:

{{ form.as_p }} это всего лишь один из многих способов отображения формы. Вы можете вывести виджет каждого отдельного поля, используя {{ form.name_of_field }} синтаксис:

 <form action="" method="post">
    {% csrf_token %}
    {{ vegetable_form.turnip }}
    {{ fruit_form.strawberry }}
    {{ vegetable_form.celery }}
    {{ fruit_form.apple }}
    <input type="submit" value="Submit" />
</form>
 

Обратите внимание, что при этом не будут отображаться ошибки. Отдельные сообщения об ошибках доступны в разделе {{ form.name_of_field.errors }} , и вы можете получить доступ к сообщениям об ошибках форм, используя {{ form.errors }} .

Взгляните на настройку шаблона формы для получения дополнительной информации по этому вопросу.

Комментарии:

1. Спасибо! Это именно то, что я хотел.