Django Многие ко Многим через промежуточную таблицу формируют форму TabularInline администратора? - PullRequest
5 голосов
/ 27 февраля 2011

Мне бы хотелось иметь форму для добавления, редактирования и удаления значений для отношения многие ко многим, используя указанную промежуточную таблицу, точно так же, как я могу получить из формы администратора TabularInline в Django.Есть ли способ сделать это?Я не нашел его в документации Django.

Я создал форму для редактирования UserProfile и хотел бы иметь возможность добавлять, редактировать и удалять многие для многих с помощью UserProfile_Language (как на языке, так и на уровне владения языком).Как мне сделать форму для этого?Как мне справиться с этим в представлении?

Мои модели следующие:

class Language(models.Model):
    LANGUAGE_ENGLISH = 1
    LANGUAGE_FRENCH = 2
    LANGUAGE_CHOICES = (
        (LANGUAGE_ENGLISH, 'English'),
        (LANGUAGE_FRENCH, 'French')
    )

    language = models.SmallIntegerField(choices=LANGUAGE_CHOICES)

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    languages = models.ManyToManyField(Language, null=True, blank=True, through='UserProfile_Language')

class UserProfile_Language(models.Model):
    FLUENT = 1
    OK = 2
    PROFICIENCY_CHOICES = (
        (FLUENT, 'Fluent'),
        (OK, 'Okay')
    )

    userprofile = models.ForeignKey(UserProfile)
    language = models.ForeignKey(Language)
    proficiency = models.SmallIntegerField(choices=PROFICIENCY_CHOICES)

1 Ответ

2 голосов
/ 27 февраля 2011

Я предполагаю, что вы имеете в виду на переднем конце, а не в админ. Я считаю, что вы можете сделать это с помощью формы набора. (http://docs.djangoproject.com/en/dev/topics/forms/formsets/). Вы должны создать форму для сквозной таблицы для использования в наборе форм.

Кроме того, вы, возможно, упростили свои модели для публикации, но если языковая модель действительно является одним из полей выбора, почему бы не объединить язык и userprofile_language в одно? Вы можете заменить ForeignKey на поле выбора и получить то же поведение. Это сделало бы ваш дисплей проще. (не обращайте внимания на то, что на самом деле язык имеет больше полей)

...