@AlexMine
Учусь

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

Здравствуйте, уже несколько дней думаю над задачей, как вывести в форме несколько раз поле categories ?

У меня есть модель
#models.py
class СategoryPrice(models.Model)
    performer = ForeignKey(Performer)
    category = ForeignKey(Category)
    price = Charfield(max_length=5)
 
class Category(models.Model):
    name = models.CharField(max_length=64)
 
    def __str__(self):
        return self.name
 
 
class Performer(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        blank=True,
        unique=True
    )
    company_name = models.CharField(max_length=30)
    categories = models.ManyToManyField(Category, throught=CategoryPrice)

И форма
class AddPerformerForm(ModelForm):

    class Meta:
        model = Performer
        fields = '__all__'
        exclude = ['user']

Как сделать так чтобы на странице выводились поля company_name, и 3 штуки categories (category, price)?
Вот что хочу получить на выходе https://jsfiddle.net/bgsq9Lr9/

И вопрос номер 2: Правильно ли я выбрал связь для Performer.categories многие ко многим при решении этой задачи?
  • Вопрос задан
  • 256 просмотров
Решения вопроса 1
@alex_vv
Перешел с Sharepoint на Python/Django - счастлив!
В вопросе 2 сомнение правильно подмечено, если надо все лишь сохранить расценки исполнителя по определенной категории, проще использовать:

- модель исполнителя
- модель категории
- модель "расценка исполнителя" с двумя ключами FK - один к исполнителю, второй к категории

M2M через through в такой ситуации - перебор.
Это из того, что видно из представленного примера. Возможно полный проект накладывает иные требования.

Ну а если все же первый вариант:

1. Вывести несколько раз одно поле модели в форму - значит форму надо кастоимзировать и лаконичным fields = '__all__' не обойтись:
class AddPerformerForm(ModelForm):
   category1 = прописываем обычное поле формы, дублирует поле модели (max_length, и т.п.)
   category2 = прописываем обычное поле формы еще раз

    class Meta:
        model = Performer
        fields = ('performer`, 'price`) # вместо "все", пишем остальные нужные поля кроме категорий
        # exclude тогда не требуется


2. Раз форма кастомная, view тоже надо прописать с кодом, где данные категории1 и категории2 или сколько бы их там ни было (ведь это many-to-many, а вы решили вручную их в html добавить в произвольном количестве) обрабатываются в таком порядке:
- (1) форму сохранить с опцией save(commit-false),
- (2) добавить к моделе исполнителя все нужные категории и, в завершение
- (3) сохранить модель/форму в базу через save().

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы