Django多对多通过中间表形式,如admin的TabularInline表单?

时间:2011-02-27 11:35:14

标签: django django-forms django-orm

我希望有一个表单,可以使用指定的中间表添加,编辑和删除多对多关系的值,就像我从Django的管理TabularInline表单中获得的那样。有没有办法做到这一点?我没有在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 个答案:

答案 0 :(得分:2)

我假设你的意思是在前端,而不是在管理员。我相信您可以使用表单集来完成此操作。 (http://docs.djangoproject.com/en/dev/topics/forms/formsets/)。您将为通过表创建一个表单以在formset中使用。

此外,您可能已经简化了发布模型,但如果语言模型实际上只是一个选择字段,为什么不将语言和userprofile_language合并为一个?您可以使用选项字段替换ForeignKey并获得相同的行为。这将使您的显示更容易。 (忽略这是语言实际上有更多字段)